2010-06-07 87 views
4

我正在使用多处理模块,并使用池来启动多个工作人员。但是在父进程中打开的文件描述符在工作进程中关闭。我想让他们开放..!有没有什么办法可以传递文件描述符以便在父项和子项之间共享?如何在python中将文件描述符从父项传递给子项?

+0

如前所述,您需要使用操作系统特有的功能。你有兴趣支持哪些平台? – Rakis 2010-06-07 13:38:07

+0

我需要支持Windows和Linux,所以我不想使用任何操作系统特定的功能。在Linux中,文件句柄是默认共享的,windows也有一个选项可以在CreateProcess()过程中共享文件句柄......我不知道为什么多处理模块没有额外的选项来共享文件句柄。 – kumar 2010-06-07 13:40:34

+1

由于Windows和Linux在传递文件句柄的语义上有所不同,因此您可能会*使用操作系统特定的功能。虽然没有问题,但是很容易区分'sys.platform'和只调用特定于操作系统的“为此操作系统工作”功能。我建议阅读多处理模块的代码,看看是否有简单的解决方法。 – Rakis 2010-06-07 13:54:29

回答

2

我不知道在进程之间共享文件描述符的方法。 如果存在某种方式,它很可能是操作系统特定的。

我的猜测是你需要在另一个层面上共享数据。

+3

同意。虽然有特定于操作系统的方法。 – unbeli 2010-06-07 13:23:33

+1

是的,我知道fork()例如会复制文件描述符,但是有没有一种简单的方法可以在流程启动后执行? – 2010-06-07 14:15:45

+1

Yep:http://stackoverflow.com/questions/909064/portable-way-to-pass-file-descriptor-between-different-processes – Rakis 2010-06-07 14:36:18

7

可以使用_multiprocessing.sendfd/recvfd函数来处理之间传输文件描述符:

示例代码:

# Before fork 
child_pipe, parent_pipe = multiprocessing.Pipe(duplex = True) 

# Main process 
import _multiprocessing 
# has socket_to_pass socket object which want to pass to the child 
_multiprocessing.sendfd(parent_pipe.fileno(), socket_to_pass.fileno()) 

# Worker process 
import _multiprocessing 
import socket 
import os 
fd = _multiprocessing.recvfd(self.child_pipe.fileno()) 
# 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 worker process\r\n") 

不幸的是,这个模块未在Python库参考记录。

1

还有一个叫做multiprocessmultiprocessing的分支,它用dill代替pickledill可以腌制文件描述符,因此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() 
相关问题