Сообщить об ошибке.

Класс Pipe() модуля multiprocessing в Python

Обмен данными между процессами при помощи канала Pipe

Синтаксис:

import multiprocessing

pipe = multiprocessing.Pipe([duplex])

Параметры:

  • duplex -

Возвращаемое значение:

Описание:

Класс Pipe() модуля multiprocessing возвращает парный кортеж (conn1, conn2), состоящий из объектов Connection, представляющих концы одного канала.

  • Если аргумент дуплекса duplex=True (по умолчанию), то тогда канал является двунаправленным.
  • Если аргумент дуплекса duplex=False, то тогда канал является однонаправленным:
    • conn1 может использоваться только для приема сообщений,
    • conn2 может использоваться только для отправки сообщений.

Объекты Connection позволяют отправлять и получать упакованные picklable объекты или текстовые или байтовые строки. Их можно рассматривать как подключенные сокеты, ориентированные на сообщения.

Методы объекта 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])