异步功能意外地相互阻塞

时间:2019-06-01 19:22:42

标签: python python-asyncio

我正在尝试在不相互阻塞的单独线程中运行两个函数。每个线程包含一个循环。

以下代码的输出:

%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

因此看来,一旦线程run1run2中的一个线程阻塞了另一个启动线程,直到当前运行完成。

我期望输出类似于:

run1
run1
run2
run2
run1
run2

如何允许线程run1run2互不阻塞?

我正在使用Python3。

1 个答案:

答案 0 :(得分:1)

time.sleep更改为相应的异步版本:

await asyncio.sleep(1)

您的代码的正确结果是:

run1
run2
run1
run2
run1
run2

因为print发生在sleep之前。