我正在使用多处理模块,并使用池来启动多个工作程序。但是在父进程中打开的文件描述符在工作进程中关闭。我希望他们开放......!有没有办法传递文件描述符在父和子之间共享?
答案 0 :(得分:7)
在Python 2和Python 3上,multiprocessing.reduction
模块中存在发送和接收文件描述符的函数。
示例代码(Python 2和Python 3):
import multiprocessing
import os
# Before fork
child_pipe, parent_pipe = multiprocessing.Pipe(duplex=True)
child_pid = os.fork()
if child_pid:
# Inside parent process
import multiprocessing.reduction
import socket
# has socket_to_pass socket object which want to pass to the child
socket_to_pass = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket_to_pass.connect("/dev/log")
# child_pid argument to send_handle() can be arbitrary on Unix,
# on Windows it has to be child PID
multiprocessing.reduction.send_handle(parent_pipe, socket_to_pass.fileno(), child_pid)
socket_to_pass.send("hello from the parent process\n".encode())
else:
# Inside child process
import multiprocessing.reduction
import socket
import os
fd = multiprocessing.reduction.recv_handle(child_pipe)
# rebuild the socket object from fd
received_socket = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
# socket.fromfd() duplicates fd, so we can close the received one
os.close(fd)
# and now you can communicate using the received socket
received_socket.send("hello from the child process\n".encode())
答案 1 :(得分:2)
我不知道如何在进程之间共享文件描述符。 如果存在某种方式,则很可能是特定于操作系统的。
我的猜测是你需要在另一个级别共享数据。
答案 2 :(得分:1)
还有一个名为multiprocess
的{{1}}分支,用pickle
替换dill
。 dill
可以腌制文件描述符,因此multiprocess
可以轻松地在进程之间传递它们。
>>> f = open('test.txt', 'w')
>>> _ = map(f.write, 'hello world')
>>> f.close()
>>> import multiprocess as mp
>>> p = mp.Pool()
>>> f = open('test.txt', 'r')
>>> p.apply(lambda x:x, f)
'hello world'
>>> f.read()
'hello world'
>>> f.close()
答案 3 :(得分:0)
multiprocessing
本身具有用于在Windows和Unix平台上的进程之间传输文件描述符的辅助方法,这些方法支持通过multiprocessing.reduction
:send_handle
和recv_handle
中的Unix域套接字发送文件描述符。 。这些没有记录,但是在模块的__all__
中,因此可以安全地假定它们是公共API的一部分。从源头上看,至少从2.6+和3.3+开始,这些功能就已经可用。
所有平台都具有相同的界面:
send_handle(conn, handle, destination_pid)
recv_handle(conn)
位置:
conn
(multiprocessing.Connection
):通过其发送文件描述符的连接handle
(int
):整数,表示文件描述符/句柄destination_pid
(int
):正在接收文件描述符的进程的整数pid-当前仅在Windows上使用