Как я могу запустить `loop.run_until_complete ()` сам асинхронно в asyncio? - PullRequest
0 голосов
/ 07 мая 2018

В следующем коде:

loop = asyncio.get_event_loop()
l_x = map(async_func, data_x)
l_y = map(async_func, data_y)
l_z = map(async_func, data_z)
x = loop.run_until_complete(asyncio.gather(*l_x))
y = loop.run_until_complete(asyncio.gather(*l_y))
z = loop.run_until_complete(asyncio.gather(*l_z))

async_func включает в себя задачу ввода-вывода и занимает немного больше времени, поэтому я собираюсь использовать asyncio для ее одновременного запуска.

Однако проблема в том, что я обнаружил, что он блокирует выполнение после первого loop.run_until_complete(), и только после того, как все выполнение на l_x завершено, он затем переходит к выполнению второго loop.run_until_complete().

Но я скорее хочу запустить их все одновременно, а также не люблю объединять три результата, поскольку все они не имеют значения. В таком случае, могу ли я по-прежнему запускать их все одновременно?

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете запустить эти сопрограммы одновременно, поставив их в очередь следующим образом:

l1 = asyncio.gather(*l_x)
l2 = asyncio.gather(*l_y)
l3 = asyncio.gather(*l_z)

results = loop.run_until_complete(asyncio.gather(l1, l2, l3))

Если вы хотите сохранить результаты каждой сопрограммы в отдельности, тогда вы можете сделать так, чтобы каждая сопрограмма присваивала результаты некоторым переменным экземпляра уровня класса.

...