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