asyncio:仅在所有其他任务正在等待时才运行任务

扎克·斯塔克(Zak Stucke):

我目前正在使用一些无尽的任务 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都在await”:所有人main_tasks都还没有准备好继续,例如处于asyncio.sleep(100)绑定状态或I / O,仍在等待数据。

因此,main_tasks不能继续执行,并且事件循环special_function在任务处于此状态时运行,而不是事件循环的每次迭代。


编辑2:

我的用例:

main_tasks要更新与网络插座新数据的数据结构。

根据special_function来自该进程的更新信号,将数据传输到另一个进程。multiprocessing具有共享变量和数据结构)

它必须是传输时可以提供的最新数据,并且不能有来自main_tasks的挂起更新。

这就是为什么我只想在没有main_tasks包含新数据可处理的情况下才运行special_function的原因。(即所有等待中await

VPfB:

我试图为“任务未准备好运行”条件编写测试。我认为asyncio不会公开调度程序的详细信息。开发人员明确表示,他们希望保留更改异步内部结构的自由,而又不会破坏向后兼容性。

asyncio.Task其中有此注释(注意:_step()运行任务协程直到下一次等待):

# An important invariant maintained while a Task not done:
#   
# - Either _fut_waiter is None, and _step() is scheduled;
# - or _fut_waiter is some Future, and _step() is *not* scheduled.

但是,该内部变量当然不在API中。

您可以_fut_waiter通过阅读的输出来获得有限的访问权限repr(task),但是格式似乎也不可靠,因此我不会依赖于这种方式:

PENDINGMSG = 'wait_for=<Future pending '

if all(PENDINGMSG in repr(t) for t in monitored_tasks):
    do_something()

无论如何,我认为您正在尝试变得过于完美。您想知道其他任务中是否有新数据。如果数据在异步缓冲区中怎么办?内核缓冲区?网卡接收缓冲区?...您永远无法知道新数据是否会在下一毫秒到达。

我的建议:将所有更新写入单个队列。检查该队列作为唯一的更新源。如果队列为空,则发布最后一个状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

仅在所有任务完成后才调用URLSession下载任务委托

Xamarin.Forms DataBinding更新,而其他任务正在运行

使用asyncio时,如何在关闭事件循环之前让所有正在运行的任务完成

多线程-仅在所有线程完成任务后才继续

VSTS-是否有办法仅在特定任务失败时才运行任务?

是异步/等待允许其他任务运行

当我不总是运行某些任务时该如何等待所有任务?

在所有其他窗口顶部的“任务计划程序”中显示消息框

创建一个在gradle中的所有其他任务之前运行的任务

取消时,连续链中的哪个任务正在运行?

仅在所有其他表数据均正确的情况下才选择一个数据

任务正在运行完成,即使它没有完成

如何等待ExecutorService中正在运行的线程之一完成以分配其他任务

IIS在等待任务时不处理其他请求

NSURLSession在所有任务完成时通知

无法从其他任务运行 gradle 任务

Electron:在所有其他窗口(甚至全屏)之上创建一个窗口并隐藏任务栏

Asyncio:发生异常时等待完成的任务

如何运行多个任务并在所有任务结束后获得结果?

运行多个异步任务,并在所有任务完成后获得通知

并行运行多个任务(变量编号),并在所有任务完成后继续

其他任务完成时通知任务

GSheets:脚本运行非常缓慢,有时无法在所有工作表上执行任务

ExecutorService并在关闭后等待其他任务完成时接受新任务

如何获取当前正在运行的所有任务

仅在等待返回的任务后才最终执行?

Python asyncio 等待任务

每个异步内部的异步任务:在所有任务和子任务完成后运行回调

仅在文件存在时才运行Ant目标的Ant任务?