2010-06-07 91 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() 
相關問題