Python流式传输标准输入输出到另一个进程

3 投票
1 回答
687 浏览
提问于 2025-04-16 23:55

我有一个在“后台”运行的Python进程。它是通过一个叫做 subprocess.Popen() 的调用启动的,完全是在另一个进程中。到目前为止,我实现的方式是这两个进程通过 multiprocessing.connections.(Listener|Client) 来互相通信。不过,我对任何能实现以下目标的方法都持开放态度。

我想要的是让这个“监听者”后台进程使用标准输入/输出/错误(std(in|out|err)),就好像它们来自“客户端”进程一样。流式处理很重要,这样输入输出就不会被读入内存,而是高效地读取和写入,同时也避免了监听者进程的阻塞。我想这意味着我需要更底层的访问权限,或者某种异步/线程/多进程的解决方案。对此我不太清楚该怎么做。例如:

while True:  # TODO
    conn = listener.accept()
    try:
        callable_, args, kw = conn.recv()
        callable_(*args, **kw)

问题是如何让可调用的函数(callable_)高效地执行标准输入/输出/错误的流式处理,并且不阻塞。这个监听者进程也是长时间运行的,我想支持任意的Python代码,这些代码在监听者模块导入时执行 from sys import std(in|out|err) 时,仍然能看到标准输入/输出/错误,就好像它们来自客户端一样。我可以在监听者启动时进行设置(修改/替换 sys.std(in|out|err)?),在其他任何东西被导入之前。

有没有好的方法可以透明地流式处理这些输入输出,使得在初始设置之后,监听者进程运行的代码可以是任意的,并且可以正常处理标准输入/输出/错误,而不会阻塞等等?最好是不要创建新的进程,因为目标是减少进程开销,尽管在客户端使用多个进程是可取的,因为客户端是轻量的。同样,如果我必须循环读取/写入标准输入/输出/错误的字节段以实现有效的流式处理,最好是在客户端完成。

1 个回答

1

我不太确定我理解这个问题,但你有没有考虑过使用select和管道/套接字来避免程序卡住?我对另一个要求“不能读入内存”有点模糊。

撰写回答