Python的multiprocessing.connection
allows for a Listener-Client pattern。您可以选择它使用的套接字类型:
connection
序列化\ pickle所有套接字类型中的消息吗?或者后两个通过发送本机Python对象来节省时间\ cpu?
答案 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 对象或字符串。他们可以被认为是面向消息的 连接插座。