Асинхронные функции неожиданно блокируют друг друга - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь запустить две функции в отдельных потоках, которые не блокируют друг друга. Каждый поток содержит цикл.

Вывод приведенного ниже кода:

%reset -f 

import asyncio
import time

async def run1():

    for i in range(0 , 3) :
        print('run1')
        time.sleep(1)

async def run2():

    for i in range(0 , 3) :
        print('run2')
        time.sleep(2)

async def main():
    results = await asyncio.gather(
        run1() , run2())

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) 
loop.run_until_complete(main())

это:

run2
run2
run2
run1
run1
run1

Но это также может быть

run1
run1
run1
run2
run2
run2

Похоже, что один из потоков run1 или run2 блокирует другой поток до тех пор, пока не завершится текущий запуск.

Я ожидаю вывод, похожий на:

run1
run1
run2
run2
run1
run2

Как разрешить потокам run1 и run2 не блокировать друг друга?

Я использую Python3.

1 Ответ

3 голосов
/ 01 июня 2019

измените time.sleep на соответствующую асинхронную версию:

await asyncio.sleep(1)

, и правильный код вашего кода:

run1
run2
run1
run2
run1
run2

, потому что print происходит раньше sleep.

...