运行两个异步功能而不会互相阻塞

时间:2018-10-12 20:05:16

标签: python python-3.x asynchronous python-asyncio

我有一个异步功能,我想“并行”运行另一个。但是我需要在第一个功能内的某个时刻这样做

我已经看到了很多示例,但是它们都同时启动了两个功能,而那不是我想要的。

我创建了这个简单的示例来说明我想要实现的目标(以及我尝试过的目标):

import asyncio
import time

async def print_letters():
    for letter in ['A', 'B', 'C', 'D']:
        print(letter)
        time.sleep(1)

async def print_numbers(loop):
    for number in range(1, 7):
        if(number == 3):
            # same result with create_task
            # loop.create_task(print_letters())
            asyncio.ensure_future(print_letters())
        print(number)
        time.sleep(1)

loop = asyncio.get_event_loop()
loop.run_until_complete(print_numbers(loop))
print('End')

当前输出:

  

1、2、3、4、5、6,A,B,C,D,结束

所需的输出将是这样的:

  

1、2、3,A,4,B,5,C,6 D,结束

我尝试了其他一些操作(例如asyncio.wait),但没有一个能按预期工作。另外,当您刚接触Python asyncio时,很难理解该文档。

如果问题不清楚或缺少某些内容,请告诉我,以便我进行编辑。感谢您的帮助。

Python 3.6.2

1 个答案:

答案 0 :(得分:2)

您需要异步函数来在等待时释放CPU,以便其他异步函数有运行的机会。使用await关键字完成了CPU的生成。另外,您需要使用sleep(...)中定义的asyncio函数,因为普通的time.sleep(...)不允许重新输入产生的函数。总而言之,这要求您的程序是

import asyncio

async def print_letters():
    for letter in ['A', 'B', 'C', 'D']:
        print(letter)
        await asyncio.sleep(1)

async def print_numbers(loop):
    for number in range(1, 7):
        if(number == 3):
            # same result with create_task
            # loop.create_task(print_letters())
            asyncio.ensure_future(print_letters())
        print(number)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()
loop.run_until_complete(print_numbers(loop))
print('End')

因此,您实际上要做的就是将time.sleep(...)替换为await asyncio.sleep(...)