Python的multiprocessing.connection是否序列化?

时间:2011-12-15 10:55:36

标签: python serialization multiprocessing

Python的multiprocessing.connection allows for a Listener-Client pattern。您可以选择它使用的套接字类型:

  • TCP套接字
  • Unix域套接字
  • Windows命名管道

connection序列化\ pickle所有套接字类型中的消息吗?或者后两个通过发送本机Python对象来节省时间\ cpu?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

某种序列化是必要的;单独的进程无法直接共享Python对象。

  

<强> 16.6.2.4. Connection Objects

     

连接对象允许发送和接收picklable   对象或字符串。他们可以被认为是面向消息的   连接插座。