python-3.x 确保部分异步任务的执行顺序,但不是全部

qc6wkl3g  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(125)

假设我在一个python函数中有以下代码:

await asyncio.gather(
    task1(),
    task2(),
    task3()
)

其中task1将运行无限循环以接收来自ws服务器的消息,而task2是具有返回布尔值的有限循环的函数。
问题是我需要得到task2的响应才能执行task3if task2 returns True, do task3, else, do nothing.
如何从Task2得到返回的布尔值?如果在gather函数之外(在函数之后)运行task2,它将永远不会运行,因为Task1是无限循环的。
而且task2需要同时运行或者在task1之后运行,所以我也不能在gather函数之前运行task2

atmip9wb

atmip9wb1#

请记住,编写异步代码与编写同步代码完全相同,除非您显式地使用并行性。在任务级,这意味着调用asyncio.gather或其他函数以等待多个任务并行执行-但在其他情况下,您的代码“按原样“运行,只有在遇到await时才能切换到其他任务。
如果您有一些事情需要有序执行,只需创建一个函数来拼写您需要的顺序,并在必要时等待,以允许不相关任务的并行性。
换句话说,要让task 3等待task 2并且两者都忽略task 1,请将具有执行顺序的任务分组到一个普通的协同例程函数中,对每个任务使用await,然后将此可并行的协同例程作为一个任务传递:

...
async def task_grouper():
    result = await task2()
    if result:
        await task3()

async def main():
    await asyncio.gather(
        task1(),
        task_grouper()
    )
...

相关问题