Блокнот Jupyter и порождающие асинхронные задания из библиотеки - PullRequest
0 голосов
/ 23 марта 2020

Я пишу библиотеку для использования с ноутбуком Jupyter. Одна из вещей, которую он делает, - асинхронное обновление прогресса в выводе ячейки ноутбука. В библиотеке у меня есть функция:

def request_result():
    start_result_calculation()  # starts a calculation and returns immediately
    asyncio.get_event_loop().create_task(report_progress())
    result = wait_for_result()  # waits for the calc to complete and returns the result
    return result

Если я сейчас вызываю result = request_result() в ячейке ноутбука Jupyter, сопрограмма report_progress() никогда не вызывается. С другой стороны, если я верну Task обратно в ячейку:

def calculate_result():
    start_result_calculation()
    return asyncio.get_event_loop().create_task(report_progress())

, то при выполнении calculate_result() в ячейке ноутбука вызывается report_progress(). Почему так, и есть ли способ заставить первую функцию работать, как ожидалось, порождая фоновую задачу и возвращая конечный результат?

1 Ответ

0 голосов
/ 24 марта 2020

Один способ, который работает в моем случае, - это запустить задачу из отдельного потока:

class _ProgressThread(threading.Thread):
   def run(self):
      asyncio.run(report_progress())


def request_result():
    start_result_calculation()
    _ProgressThread().start()
    result = wait_for_result()
    return result

Мне все еще нужно использовать asyncio в этом потоке из-за требований кода который проходит внутри report_progress().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...