假设我在一个python函数中有以下代码:
await asyncio.gather(
task1(),
task2(),
task3()
)
其中task1
将运行无限循环以接收来自ws服务器的消息,而task2
是具有返回布尔值的有限循环的函数。
问题是我需要得到task2
的响应才能执行task3
。if task2 returns True, do task3, else, do nothing.
如何从Task2
得到返回的布尔值?如果在gather函数之外(在函数之后)运行task2
,它将永远不会运行,因为Task1
是无限循环的。
而且task2
需要同时运行或者在task1
之后运行,所以我也不能在gather函数之前运行task2
。
1条答案
按热度按时间atmip9wb1#
请记住,编写异步代码与编写同步代码完全相同,除非您显式地使用并行性。在任务级,这意味着调用
asyncio.gather
或其他函数以等待多个任务并行执行-但在其他情况下,您的代码“按原样“运行,只有在遇到await
时才能切换到其他任务。如果您有一些事情需要有序执行,只需创建一个函数来拼写您需要的顺序,并在必要时等待,以允许不相关任务的并行性。
换句话说,要让task 3等待task 2并且两者都忽略task 1,请将具有执行顺序的任务分组到一个普通的协同例程函数中,对每个任务使用
await
,然后将此可并行的协同例程作为一个任务传递: