Я пишу библиотеку для использования с ноутбуком 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()
. Почему так, и есть ли способ заставить первую функцию работать, как ожидалось, порождая фоновую задачу и возвращая конечный результат?