Заполняются ли многопроцессорные каналы, и если да, то какое поведение они вызывают в программе? - PullRequest
0 голосов
/ 23 октября 2019

Я работаю над многопоточной программой на Python и использую каналы, но обнаружил, что они замирают в определенный момент (что я считаю относительно небольшим объемом данных). У меня есть тестовый пример ниже. Я пробовал копаться в документации, но не смог ничего найти.

import multiprocessing
def test():
   out_, in_ = multiprocessing.Pipe()
   for i in range(10**6):
      print(i)
      in_.send(i)

Когда я запускаю этот код, он печатает до 278, а затем останавливается, что кажется небольшим объемом данных. Это из-за нехватки памяти или чего-то еще? Есть ли какие-либо обходные пути или параметры, которые я мог бы использовать, чтобы увеличить размер?

1 Ответ

0 голосов
/ 23 октября 2019

Да, трубы имеют ограниченный объем хранилища, объем зависит от операционной системы. Если процесс пытается записать в канал быстрее, чем другой процесс читает из него, канал в конечном итоге заполнится. Когда это произойдет, следующая попытка записи будет заблокирована, пока читатель не прочитает достаточно, чтобы освободить место для него.

Канал также можно перевести в неблокирующий режим. В этом случае попытка записи в полный канал вернет сообщение об ошибке, и код записи может решить, как с этим справиться. Похоже, что модуль Python multiprocessing не может установить канал без блокировки. Многопроцессное неблокирующее взаимодействие Python с использованием Pipes говорит, что способ сделать этот тип обработки - использовать in_.poll(), чтобы определить, доступен ли канал для записи.

...