Собранные задачи не запускаются одновременно, если оператор печати не закомментирован. Зачем? - PullRequest
0 голосов
/ 30 апреля 2019

Я писал сценарий для одновременного выполнения нескольких длительных задач и заметил, что одновременно может выполняться только одна задача.После долгих проб и ошибок я понял, что проблема вызвана странным взаимодействием между 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()

1 Ответ

0 голосов
/ 30 апреля 2019

Вероятно, проблема с некоторым кодом, который вы пропустили.Приведенный ниже пример (это работающая версия вашего примера), похоже, не имеет проблемы (т.е. работает без проблем):

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