import multiprocessing pipe = multiprocessing.Pipe([duplex])
duplex
- (conn1, conn2)
, состоящий из объектов Connection
.Класс Pipe()
модуля multiprocessing
возвращает парный кортеж (conn1, conn2)
, состоящий из объектов Connection
, представляющих концы одного канала.
duplex=True
(по умолчанию), то тогда канал является двунаправленным. duplex=False
, то тогда канал является однонаправленным:Объекты Connection
позволяют отправлять и получать упакованные picklable
объекты или текстовые или байтовые строки. Их можно рассматривать как подключенные сокеты
, ориентированные на сообщения.
Connection
.Connection.send()
отправляет объект на другой конец соединения,Connection.recv()
возвращает объект, отправленный с другого конца соединения,Connection.fileno()
возвращает файловый дескриптор соединения,Connection.close()
закрывает соединение,Connection.poll()
возвращает, если есть какие-либо данные,Connection.send_bytes()
отправляет байтовые данные из байтового объекта,Connection.recv_bytes()
возвращает полное сообщение байтовых данных,Connection.recv_bytes_into()
читает в буфер полное сообщение байтовых данных.Connection
Connection.send(obj)
:Метод Connection.send()
отправляет объект obj
на другой конец соединения, который должен быть прочитан с помощью метода Connection.recv()
.
Объект должен быть упакован picklable
. Очень большие объекты picklable
(примерно 32 МБ+, хотя это зависит от операционной системы) могут вызвать исключение ValueError
.
Connection.recv()
:Метод Connection.recv()
возвращает объект, отправленный с другого конца соединения с помощью функции Connection.send()
.
Блокируется до тех пор, пока есть что получить. Поднимает исключение EOFError
, если больше нечего принимать, а другой конец был закрыт.
Connection.fileno()
:Метод Connection.fileno()
возвращает файловый дескриптор или дескриптор, используемый соединением.
Connection.close()
:Метод Connection.close()
закрывает соединение.
Метод вызывается автоматически при сборке мусора.
Connection.poll([timeout])
:Метод Connection.poll()
возвращает, если есть какие-либо данные, доступные для чтения.
timeout
не указан, то метод возвращает результат немедленно. timeout
- это число, то он указывает максимальное время блокировки в секундах. timeout=None
, то используется бесконечный тайм-аут. Другими словами, метод ждет до упора, пока не поступят данные.Обратите внимание, что несколько объектов подключения могут быть опрошены одновременно с помощью multiprocessing.connection.wait()
.
Connection.send_bytes(buffer[, offset[, size]])
:Метод Connection.send_bytes()
отправляет байтовые данные из байтового объекта в виде полного сообщения.
Если задано смещение offset
, то данные считываются из этой позиции в буфере buffer
.Если указан размер size
, то переданное количество байт будет прочитано из буфера.
Очень большие буферы buffer
(примерно 32 МБ +, хотя это зависит от ОС) могут вызвать исключение ValueError
.
Connection.recv_bytes([maxlength])
:Метод Connection.recv_bytes()
возвращает полное сообщение байтовых данных, отправленных с другого конца соединения в виде строки.
Блокируется до тех пор, пока есть что получить. Поднимает исключение EOFError
, если больше нечего получить, а другой конец был закрыт.
Если задан аргумент maxlength
и сообщение длиннее maxlength
, то возникает ошибка OSError
, а соединение больше не будет читаться.
Connection.recv_bytes_into(buffer[, offset])
:Метод Connection.recv_bytes_into()
читает в буфер полное сообщение байтовых данных, отправленное с другого конца соединения, и возвращает количество байтов в сообщении.
Блокируется до тех пор, пока есть что получить. Поднимает исключение EOFError
, если больше нечего получить, а другой конец был закрыт.
Аргумент buffer
должен быть записываемым байтовым объектом (array.array
, bytearray
или memoryview
).
Если задано смещение offset
, то сообщение будет записано в буфер с этой позиции. Смещение должно быть неотрицательным целым числом меньше длины буфера (в байтах).
Если буфер слишком короткий, то возникает исключение BufferTooShort
, а полное сообщение будет доступно как e.args[0]
, где e
это экземпляр исключения.
Connection
.>>> from multiprocessing import Pipe >>> a, b = Pipe() >>> a.send([1, 'hello', None]) >>> b.recv() # [1, 'hello', None] >>> b.send_bytes(b'thank you') >>> a.recv_bytes() # b'thank you' >>> import array >>> arr1 = array.array('i', range(5)) >>> arr2 = array.array('i', [0] * 10) >>> a.send_bytes(arr1) >>> count = b.recv_bytes_into(arr2) >>> assert count == len(arr1) * arr1.itemsize >>> arr2 # array('i', [0, 1, 2, 3, 4, 0, 0, 0, 0, 0])