我目前正在使用asyncio.wait
执行一些无限的任务
当所有其他任务处于await
状态时,我需要运行一个特殊的函数
import asyncio
async def special_function():
while True:
# does some work,
# Passes control back to controller to run main_tasks
# if they are no longer waiting.
await asyncio.sleep(0)
async def handler():
tasks = [task() for task in main_tasks]
# Adding the task that I want to run when all main_tasks are awaiting:
tasks.append(special_function())
await asyncio.wait(tasks)
asyncio.get_event_loop().run_until_complete(handler())
我如何才能使 special_function
只在所有 main_tasks
都在 await
时运行?修改: 我的意思是“所有的
main_tasks
都没有准备好继续执行,例如处于asyncio.sleep(100)
或I/O绑定状态,仍在等待数据。”因此,在任务处于这种状态时,
main_tasks
无法继续执行,事件循环会运行special_function
,而不是每次事件循环迭代。用例:
main_tasks
正在使用来自Web套接字的新数据更新数据结构。
special_function
会在收到来自该进程的更新信号时将数据传输到另一个进程(具有共享变量和数据结构的multiprocessing
)。
它需要在传输时是最新的数据,不能有待处理的主任务更新。
这就是为什么我只想在没有可处理的新数据的主任务时运行special_function
。
special_function
的语法不正确,而且在asyncio.sleep(0)
前面也缺少了一个await
。一旦你修复了这个问题,它就会在事件循环的每次迭代中运行“做一些工作”的部分。由于 asyncio 是单线程的,所以当它运行时,所有其他任务都在等待某些东西。你不需要做任何特殊的安排来实现这一点,这就是 asyncio 的工作原理 - 如果一个任务没有等待任何东西,那么它就意味着它正在运行(或已经完成)。 - user4815162342