все Python 3multiprocessingфункция
multiprocessing.Pipe()
обмен данными
Создаёт канал из двух концов-соединений (Connection) с методами send() и recv(). Быстрее очереди, но рассчитан ровно на двух участников.
Синтаксис
conn1, conn2 = multiprocessing.Pipe(duplex=True)
Pipe(duplex=False) возвращает пару (только чтение, только запись) — первым идёт читающий конец, и перепутать их легко: recv() на пишущем даёт OSError. Если два процесса одновременно читают или пишут в один и тот же конец, данные могут перемешаться — для многих участников берите Queue. recv() получит EOFError, только когда закрыты все копии другого конца, поэтому родитель после start() закрывает свою копию конца ребёнка, иначе ждёт вечно. Недокументированная allow_connection_pickling сегодня лишь импортирует multiprocessing.connection — соединения и так передаются между процессами.
Примеры
import multiprocessing as mp
def child(conn):
conn.send({'status': 'ok'})
conn.close()
if __name__ == '__main__':
ctx = mp.get_context('spawn')
parent_end, child_end = ctx.Pipe()
p = ctx.Process(target=child, args=(child_end,))
p.start()
child_end.close() # своя копия конца ребёнка не нужна
print(parent_end.recv()) # → {'status': 'ok'}
p.join()
import multiprocessing as mp
if __name__ == '__main__':
reader, writer = mp.Pipe(duplex=False)
writer.send([1, 2])
print(reader.recv()) # → [1, 2]
try:
writer.recv()
except OSError as e:
print(e) # → connection is write-only
writer.close()
try:
reader.recv()
except EOFError:
print('EOF') # → EOF
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности