python - 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()
被调用。为什么会这样,有没有办法让第一个函数按预期工作,产生一个后台任务并返回最终结果?
解决方案
在我的情况下,一种解决方法是从单独的线程运行任务:
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()
。
推荐阅读
- python - 你如何区分python中的进程和线程?
- javascript - 如何编辑我的幻灯片以使其具有响应性?
- powerapps - PowerApps“无日期时间”控制小时偏移
- html - 如何在 Markdown 中编码并正确转换为 HTML?
- node.js - max-age、min-fresh 和 max-stale HTTP 标头如何从使用 Express js 作为服务器的客户端(请求标头)工作?
- python-3.x - FileNotFoundError:[Errno 2] 没有这样的文件或目录:'/Users/x/anaconda3/lib/python3.6/site-packages/numpy-1.19.4.dist-info/RECORD'
- python - 如何识别评论文本的情绪与评分不匹配的评论
- cryptography - PFXExportCertStoreEx API 未将私钥导出到 PFX 文件
- python - Pandas 加权总和 / Sumproduct
- c - C读取文件行到数组仅打印行中的第一个字符