2013-09-25 3 views
0

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

Так вот мои вопросы:

1) Программа выводит очень большой текстовый файл. Я только хочу сохранить вывод в новый файл (так что не сохранять строку как объект python), что лучший способ сделать это с помощью модуля подпроцесса?

2) Я хочу вызвать программу много раз параллельно с помощью многопроцессорного модуля. Обычно я просто прохожу простым способом и использую функцию Pool.map, будет ли это мешать модулю подпроцесса?

Заранее благодарен!

ответ

2

1) Программа выводит очень большой текстовый файл. Я только хочу сохранить вывод в новый файл (так что не сохранять строку как объект python), что лучший способ сделать это с помощью модуля подпроцесса?

Если посмотреть на the documentation, допустимые значения для 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, это просто, что процессы внуков не совпадают с дочерними процессами.)

+0

Спасибо за ответ. Есть ли какая-то конкретная причина для использования 'with open'? – Misconstruction

+0

@Misconstruction: вы должны почти всегда использовать 'with', когда используете' open'. В противном случае вам понадобится другой способ гарантировать, что 'outfile.close()' будет вызван независимо от того, что даже при исключении или раннем возврате или что-то еще. (Особенно в файлах с возможностью записи, где невозможно закрыть файл, это может означать, что последние несколько строк никогда не попадают на диск.) В этом конкретном случае ... нет никакого риска, но даже здесь он сохраняет несколько нажатий клавиш, а это означает, что я не делаю «Должен ли я думать о том, есть ли риск. – abarnert

Смежные вопросы