Объединение подпроцесса и многопроцессорного модуля
Я создаю небольшой конвейер для обработки большого количества данных, и я решил использовать python для вызова программы с использованием нескольких ядер.
Итак, вот мои вопросы:
1) Программа выводит очень большой текстовый файл. Я только хочу сохранить вывод в новый файл (поэтому не сохраняйте строку как объект Python), каков наилучший способ сделать это с помощью модуля подпроцесса?
2) Я хочу вызывать программу много раз параллельно, используя многопроцессорный модуль. Обычно я просто иду простым путем и использую функцию Pool.map, не помешает ли это модулю подпроцесса?
Заранее спасибо!
1 ответ
1) Программа выводит очень большой текстовый файл. Я только хочу сохранить вывод в новый файл (поэтому не сохраняйте строку как объект Python), каков наилучший способ сделать это с помощью модуля подпроцесса?
Если вы посмотрите на документацию, допустимые значения для stdout
являются:
PIPE, существующий файловый дескриптор (положительное целое число), существующий файловый объект и None.
Так:
with open('new_file.txt', 'w') as outfile:
subprocess.call(['program', 'arg'], stdout=outfile)
2) Я хочу вызывать программу много раз параллельно, используя многопроцессорный модуль. Обычно я просто иду простым путем и использую функцию Pool.map, не помешает ли это модулю подпроцесса?
Нет, если вы не делаете некоторые странные вещи.
multiprocessing.Pool
отслеживает, какие процессы он создал, и не будет пытаться управлять другими дочерними процессами, которые могут быть созданы в других местах, поэтому очевидная вещь, о которой вы беспокоитесь, не проблема.
Наиболее распространенная проблема, которую я видел, это использование Popen
создавать дочерние процессы, которые вы никогда не пожнете. Вам часто это сойдет с рук в приложении без multiprocessing
, но как только вы сделаете Popen
- и утечка в задаче пула, вы перестаете сойти с рук. (Это на самом деле ничего multiprocessing
или Python; просто процессы внуков не совпадают с дочерними процессами.)