首页 > 解决方案 > Jupyter 笔记本和从库中生成异步任务

问题描述

我正在编写一个与 Jupyter notebook 一起使用的库。它所做的一件事是异步更新笔记本单元输出中的进度。在图书馆我有一个功能:

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()被调用。为什么会这样,有没有办法让第一个函数按预期工作,产生一个后台任务并返回最终结果?

标签: pythonjupyter-notebookpython-asyncio

解决方案


在我的情况下,一种解决方法是从单独的线程运行任务:

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()


推荐阅读