gpt4 book ai didi

python-3.x - 在 Python 多处理中共享文件描述符

转载 作者:行者123 更新时间:2023-12-04 13:49:02 24 4
gpt4 key购买 nike

我正在尝试使用 Python 的多处理模块来生成一个服务器来接收 UDP 消息,稍微修改它们,然后将它们传递给使用 subprocess 模块启动的 grep 进程。由于 Popen 子进程的标准输入接受文件描述符,这就是我想要传递给它的内容。

我遇到的问题是获取与服务器进程通信的文件描述符,我可以将其传递给 grep 子进程。我过去曾使用普通的 os.fork() 和 os.pipe() 来完成此操作,但我现在想将多处理与 spawn start 方法结合使用。我尝试从 os.pipe 中获取一个写描述符,使其可继承,并通过 multiprocess.Process 将其作为参数传递给新进程。当我尝试使用 os.fdopen(fd, 'wb') 在另一个进程中打开它时,我收到错误文件描述符的 OSError。这是我测试过的代码片段。

def _listen_syslog(ip_address, port, write_pipe):    f = os.fdopen(write_pipe, 'wb')    #do stuff like write to the filedef listen_syslog(ip_address, port):    r, w = os.pipe()    os.set_inheritable(w, True)    proc = mp.Process(target=_listen_syslog, args=(ip_address, port, w))    proc.start()    #this process doesn't need to write, so close it    os.close(w)    #this is the descriptor I want to pass to a grep subprocess stdin    #a similar scenario has worked before using os.fork()    return r

最后,如果无法使用通过 os.pipe() 创建的管道执行此操作,我可以使用 multiprocessing.Pipe(),并使用连接对象 fileno() 函数中的文件描述符直接使用吗?更重要的是,只要我不将连接对象用于其他任何事情,这样做就安全吗?

最佳答案

我找到了一个解决方案。我还没有弄清楚如何使用 os.pipe(),但是如果我使用 multiprocessing.Pipe(),我可以使用每个连接对象的文件描述符调用它们的 fileno() 函数。我发现的另一件事是,如果你想在不再引用连接对象后使用文件描述符,你必须在每个文件描述符上调用 os.dup() ,否则它们将关闭并且你当连接对象被垃圾收集时,将得到一个错误的文件描述符错误。

import multiprocessing as mp

def _listen_syslog(ip_address, port, write_pipe):
f = os.fdopen(write_pipe.fileno(), 'wb')
#do stuff


def listen_syslog(ip_address, port):
r, w = mp.Pipe(False)
proc = mp.Process(target=_listen_syslog, args=(ip_address, port, w))
proc.start()
return os.dup(r.fileno())

关于python-3.x - 在 Python 多处理中共享文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27625926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com