【问题标题】:Run two async functions without blocking each other运行两个异步函数而不会相互阻塞
【发布时间】:2018-10-12 20:05:16
【问题描述】:

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

我见过很多例子,但都是同时启动两个函数,这不是我想要的。

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

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

【问题讨论】:

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


【解决方案1】:

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

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(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多