运行两个异步函数而不互相阻塞

2024-01-29

我有一个异步函数,我想“并行”运行另一个异步函数。但我需要在某个时刻去做在第一个函数内.

我见过很多例子,但它们都同时启动两个功能,这不是我想要的。

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

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


您需要异步函数在等待时让出 CPU,以便其他异步函数有机会运行。使用以下命令让出 CPU 完成await关键词。此外,您还需要使用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(...) with await asyncio.sleep(...).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行两个异步函数而不互相阻塞 的相关文章

随机推荐