【发布时间】:2016-10-19 23:46:46
【问题描述】:
我正在浏览 asyncio 的 Python 文档,我想知道为什么大多数示例使用 loop.run_until_complete() 而不是 Asyncio.ensure_future()。
例如:https://docs.python.org/dev/library/asyncio-task.html
看来ensure_future 会是一个更好的方式来展示非阻塞函数的优势。另一方面,run_until_complete 像同步函数一样阻塞循环。
这让我觉得我应该使用 run_until_complete 而不是 ensure_future 和 loop.run_forever() 的组合来同时运行多个协同程序。
【问题讨论】:
-
run_until_complete不会阻止任何内容。它与run_forever的区别在于循环在协程完成时暂停。唯一会阻塞的情况是你的协程从不等待。 -
我写了这个pastebin.com/Qi8dQ3bh,但它似乎确实阻止了循环。
do_other_things()直到do_io()完成后才会执行,即使do_io()等待睡眠。 -
那是因为循环中没有安排其他任何事情。在拨打
run_forever之前尝试拨打loop.create_task(do_other_things())。