В простом скрипте, который использует подпроцесс для вывода gzip (используя subprocess.PIPE для stdin внешней команды), если объект multiprocessing.Pool создается между моментом времени подпроцесс создается и stdin процесса закрывается, subprocess.wait() будет зависать вечно.Подпроцесс подпроцесса Python() терпит неудачу, если многопроцессор. Создается пул
import multiprocessing
import subprocess
proc = subprocess.Popen(["gzip", "-c", "-"],
stdout=open('filename', 'w'), stdin=subprocess.PIPE)
multiprocessing.Pool()
proc.stdin.close()
proc.wait()
Перемещение многопроцессорной обработки. Перемещение по одной линии вверх или одна строка вниз предотвращает проблему.
Я испытываю это на Python 2.7.3 (Linux) и Python 2.7.1 (OS X).
Очевидно, что это тривиальный пример - реальное использование намного сложнее. Я также уже знаю GzipFile - я бы предпочел не использовать его; использование подпроцесса позволяет мне увеличить загрузку процессора, разделив gzipping на отдельный поток.
Я не вижу, как просто создание пула должно иметь такое влияние.
Отлично! Спасибо за объяснение - по крайней мере теперь это имеет смысл (хотя это отстой). В моем случае записи многопроцессорности вообще не записываются в файлы, но реструктуризация кода будет ... немного больной. Похоже, что это, вероятно, единственный способ пойти. Я на самом деле не понял, что у вас могут быть дубликаты файловых дескрипторов. –
Это не единственный способ: как я заметил, используя функцию инициализатора, вы можете закрыть определенные дескрипторы. Я просто подозреваю (без какого-либо кода, чтобы посмотреть), что это будет по крайней мере так же сложно, как избежать их открытости в первую очередь. :-) – torek