Как добавить новую подпрограмму к уже запущенному l oop в Python asyncio? - PullRequest
1 голос
/ 19 июня 2020

Я написал такой код.

import asyncio
import time
import random

async def secondCoro(myId):
    waiting_time = random.randint(1,5)
    while 1:
        print("i am {} ".format(myId))
        time.sleep(waiting_time)


async def main():
    for i in range (10):
        await loop.create_task(secondCoro(i))
        time.sleep(0.1)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

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

i am 0

i am 2

i am 4

i am 1

i am 2

i am 8

i am 5

Но когда я запускаю этот код, он показывает только:

i am 0

i am 0

i am 0

Это достижимо? Если да, то в чем проблема в моем коде и как это исправить? Если ошибок нет, есть ли какие-нибудь способы запустить множество совместных подпрограмм?

1 Ответ

1 голос
/ 19 июня 2020

Есть две проблемы с вашим кодом:

  • asyn c код не должен блокироваться, поэтому вместо вызова time.sleep() вы должны ждать asyncio.sleep().

  • «await» означает «ждать, пока не будет выполнено», поэтому, когда вы ожидаете задачи в l oop в main (), вы никогда не пройдете первую итерацию l oop, потому что задача никогда не завершается.

Есть несколько способов исправить вторую проблему. Например, вы можете вызвать asyncio.gather() или оставить l oop как есть, но опустить ожидание задач и вместо этого ожидать их через секунду l oop. Например:

async def secondCoro(myId):
    waiting_time = random.randint(1,5)
    while True:
        print("i am {} ".format(myId))
        await asyncio.sleep(waiting_time)

async def main():
    # start all the tasks
    tasks = [asyncio.create_task(secondCoro(i)) for i in range(10)]
    # and await them, which will basically wait forever, while still
    # allowing all the tasks to run
    for t in tasks:
        await t

asyncio.run(main())
...