Все каналы передачи, которые могут использоваться 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