除非已注释掉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语句,否则收集的任务不会同时运行。为什么?的主要内容,如果未能解决你的问题,请参考以下文章

除非显式注释,否则不会发现 CDI bean

除非在 [重复] 之前打印条件,否则不会调用 if 语句

除非用户登录,否则 VB6 应用程序不会按计划任务执行

除非已登录Google帐户,否则不会显示嵌入式Google日历

除非滚动,否则 UICollectionViewCells 不会加载

除非再次初始化GoogleMap,否则位置为空