управление процессом параллелизма в очереди Python - PullRequest
2 голосов
/ 03 ноября 2010

Вариант использования следующий: У меня есть сценарий, который запускает серию не-Python исполняемые файлы для сокращения (пульсар) данных. Я сейчас пользуюсь subprocess.Popen (..., shell = True) и затем передать функцию подпроцесса захватить стандартный вывод и стандартную ошибку из исполняемых файлов, не являющихся python, и записанный вывод, который я записываю с помощью модуля регистрации python

Проблема в том, что в большинстве случаев используется только одно ядро ​​из 8 возможных. Я хочу порождать несколько процессов, каждый из которых выполняет часть набора данных параллельно, и я хочу отслеживать прогресс. Это скрипт / программа для анализа данных с низкочастотного радиотелескопа (LOFAR). Чем проще установить / управлять и протестировать, тем лучше. Я собирался создать код для управления всем этим, но я уверен, что он уже должен существовать в некоторой простой форме библиотеки.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Модуль subprocess может отлично запускать несколько процессов и отслеживать их.Проблема, однако, заключается в чтении выходных данных каждого процесса без блокировки каких-либо других процессов.В зависимости от платформы есть несколько способов сделать это: с помощью модуля select увидеть, какой процесс имеет данные для чтения, установить неблокирование выходных каналов с помощью модуля fnctl, использовать потоки для чтения данных каждого процесса (чтоsubprocess.Popen.communicate сам использует в Windows, потому что у него нет двух других вариантов.) Однако в каждом случае дьявол кроется в деталях.

Что-то, что обрабатывает все это для вас, Twisted, который может порождать столько процессов, сколько вы хотите, и может вызывать ваши обратные вызовы с данными, которые они производят (а также в других ситуациях.)

2 голосов
/ 03 ноября 2010

Может быть Сельдерей будет служить вашим потребностям.

0 голосов
/ 03 ноября 2010

Если я правильно понимаю, что вы делаете, я мог бы предложить немного другой подход. Попробуйте установить отдельную единицу работы как функцию, а затем слой на параллельной обработке. Например:

  1. Обернуть текущую функциональность (вызов подпроцесса и захват вывода) в одну функцию. Пусть функция создаст объект результата, который можно вернуть; в качестве альтернативы, функция может записывать в файлы по своему усмотрению.
  2. Создайте итерацию (список и т. Д.), Которая содержит входные данные для каждого блока данных для шага 1.
  3. Создайте многопроцессорный пул, а затем используйте его функции map () для выполнения вашей функции, начиная с шага 1, для каждого элемента в шаге 2. Подробнее см. В документации по многопроцессорной обработке python.

Вы также можете использовать модель «работник / очередь». Ключ, я думаю, заключается в том, чтобы инкапсулировать текущие данные захвата подпроцесса / вывода в функцию, которая выполняет работу для одного куска данных (что бы это ни было). Расслоение на параллельную часть обработки в таком случае довольно просто с использованием любого из нескольких методов, только несколько из которых были описаны здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...