除非已注释掉print语句,否则收集的任务不会同时运行。为什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了除非已注释掉print语句,否则收集的任务不会同时运行。为什么?相关的知识,希望对你有一定的参考价值。
我正在编写一个脚本来同时执行一系列长时间运行的任务,并注意到一次只能运行一个任务。在经历了许多令人沮丧的试验和错误之后,我发现问题是由asyncio.sleep()和print()之间的一些奇怪的交互引起的,这些交互是在运行每个任务的协程中的循环内部。一旦我注释掉print(),一切都按预期同时运行。
经过一些Python文档搜索和Google搜索后,我仍然不知道为什么会这样。
下面的代码示例已经大大简化,以说明问题。
注意:Python 3.6
async task_coro():
...setup the task...
while not_done():
print(...some informative status stuff...)
## The argument here could be 0.1, 1.0, 10, 100, it doesn't matter.
## as long as the above print() call is uncommented nothing works ;_;
asyncio.sleep(0.1)
if __name__ == '__main__':
task_coros = [
task_coro() for i in range(10)
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*task_coros))
loop.close()
答案
您遗漏的一些代码可能会出现问题。下面的示例(这是您的示例的运行版本)似乎没有问题(即运行没有问题):
import asyncio
async def task_coro():
x = 0
while x < 10:
print(f'...some informative status stuff ({x})...')
await asyncio.sleep(0.1)
x += 1
if __name__ == '__main__':
task_coros = [
task_coro() for i in range(10)
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*task_coros))
loop.close()
以上是关于除非已注释掉print语句,否则收集的任务不会同时运行。为什么?的主要内容,如果未能解决你的问题,请参考以下文章
除非已登录Google帐户,否则不会显示嵌入式Google日历