2011-12-15 20 views

回答

3

multiprocessing.Connection(不同類型的插座和管道)可以使用的所有傳輸通道都以類流的方式工作。因此,爲了通過這些通道發送和接收Python對象必須被序列化/反序列化(或者如果你想這樣說明,編碼/解碼)。

在多處理模塊共享的_ConnectionBase方法,它實現recv()send(obj)所有連接類型:

def send(self, obj): 
    """Send a (picklable) object""" 
    self._check_closed() 
    self._check_writable() 
    buf = io.BytesIO() 
    ForkingPickler(buf, pickle.HIGHEST_PROTOCOL).dump(obj) 
    self._send_bytes(buf.getbuffer()) 

def recv(self): 
    """Receive a (picklable) object""" 
    self._check_closed() 
    self._check_readable() 
    buf = self._recv_bytes() 
    return pickle.loads(buf.getbuffer()) 

在這裏,我們看到,所有的Python對象由pickle序列使用二進制協議被髮送之前和在收到後解序列化。實際的發送/接收是在_send_bytes_recv_bytes方法中執行的,對於每種傳輸信道,其實施方式不同。

參考: https://github.com/schmir/python/blob/master/Lib/multiprocessing/connection.py

2

某種序列化是必要的;單獨的進程不能直接共享Python對象。

16.6.2.4. Connection Objects

連接對象允許發送和接收picklable 對象或串。他們可以被認爲是以消息爲導向的連接套接字 。

+0

進程實際上可以通過[Managers](http://docs.python.org/library/multiprocessing.html#multiprocessing-managers)共享Python對象。另外,「可揀貨物」並不意味着它們必須被醃製。我確定他們是通過TCP套接字序列化的,但我的問題是關於另外兩種套接字類型的...... – Jonathan 2011-12-15 15:16:05