Python Glossary English

все 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Сообщить о неточности