Ответ на часть 1:
Все, что должно пройти через multiprocessing.Queue
(или Pipe
или что-то еще), должно быть отборным . Это включает в себя основные типы, такие как tuple
s, list
s и dict
s. Также поддерживаются классы, если они верхнего уровня и не слишком сложны (проверьте детали). Однако попытка передать lambda
с не удастся.
Ответ на часть 2:
A put
состоит из двух частей: для изменения очереди требуется семафор, а при необходимости запускается поток фидера. Поэтому, если никакой другой Process
не попытается put
к тому же Queue
в одно и то же время (например, потому что в него записывается только один Process
), это должно быть быстро. Для меня это оказалось достаточно быстро для всех практических целей.
Частичный ответ на часть 3:
- На обычном
multiprocessing.queue.Queue
отсутствует метод task_done
, поэтому его нельзя использовать в качестве прямой замены. (Подкласс обеспечивает метод.)
- В старой версии
processing.queue.Queue
отсутствует метод qsize
, а в более новой версии multiprocessing
неточная (просто помните об этом).
- Поскольку файловые дескрипторы обычно наследуются в
fork
, необходимо соблюдать осторожность при их закрытии в правильных процессах.