【发布时间】:2020-11-26 11:43:30
【问题描述】:
我正在尝试将事件侦听器附加到 python 子进程,每当进程关闭/退出时都会调用它。回调将重新生成子进程并将相同的事件侦听器附加到新的。
类似于在 node.js 中从 child_process 调用 .on
我已经知道this thread。但理想情况下,我希望使用 asyncio.subprocess 来执行此操作,而不是在单独的线程中运行每个事件侦听器。
我在想这样的事情-
from asyncio import subprocess as asubprocess
from typing import Callable, Awaitable
async def handle_close(proc: asubprocess.Process, spawner: Callable[[], Awaitable[asubprocess.Process]]):
while True:
await proc.wait()
proc = await spawner()
(此函数还可以扩展为获取进程列表及其各自的生成器和所有进程的asyncio.wait,一旦它们中的任何一个停止 - 它们将重新生成并重复该过程)
proc 参数将是由 asubprocess.create_subprocess_exec 返回的进程,spawner 将是重新生成该子进程的异步函数。 (或任何其他回调)
唯一的问题是,我不知道如何在后台运行它而不用async 污染我的整个代码库。理想情况下,会有多个子进程在后台需要它们自己的handle_close。当所有这些处理程序都在运行时,不应阻塞调用者代码。
在我自己的用例中,我不需要进程句柄,因此可以丢弃这些句柄,只要进程继续运行并在它们停止的情况下重新生成并且生成所有进程的调用者代码可以控制执行其他操作,没关系。
【问题讨论】:
标签: python event-handling subprocess python-asyncio