Управление многопроцессорностью Python

Я хорошо знаком с многопроцессорным модулем Python, но не знаю, как реализовать эту настройку. Мой проект имеет этот основной поток:

запросить последовательное устройство -> собрать ответ -> разобрать ответ -> утвердить ответ -> повторить

Сейчас это последовательная операция, которая повторяется до тех пор, пока не соберет желаемое количество утвержденных ответов. Я надеялся ускорить эту задачу, заставив «главный процесс» выполнить первые две операции, а затем передать задачу синтаксического анализа и утверждения в очередь рабочих процессов. Однако это полезно только в том случае, если главный процесс ВСЕГДА запущен. Я гарантированно работаю на многоядерной машине.

Есть ли способ, чтобы процесс в многопроцессорном модуле всегда имел фокус/запуск, чтобы я мог этого добиться?


person Philip Massey    schedule 01.08.2013    source источник
comment
Я не уверен, что вы спрашиваете. Вы запускаете процессы, которые работают вечно и взаимодействуют друг с другом. Можете объяснить, где проблема?   -  person freakish    schedule 01.08.2013
comment
Если я понимаю, как правильно работают процессы, то при создании нескольких процессов их фокус (с точки зрения процессора) произвольный. IE, если бы я получил 4 ответа и передал синтаксический анализ рабочим, может быть время, когда мой 4-ядерный процессор работает только с заданиями синтаксического анализа, а не с процессом последовательной связи. Я надеялся, что есть способ гарантировать, что процесс последовательной связи всегда находится в фокусе процессора.   -  person Philip Massey    schedule 01.08.2013
comment
Вы не можете заставить процессор сосредоточиться на данном процессе (по крайней мере, не под разумной ОС). Но вы что-то не так понимаете: дело не в том, что процессор будет фокусироваться на этих 4-х процессах, пока они не закончат работу. Переключение контекста происходит в середине задания (поэтому можно открыть, например, 10 проигрывателей фильмов, и все они будут работать одновременно). Так что не стоит об этом переживать, ваш сервер не заблокируют.   -  person freakish    schedule 01.08.2013
comment
Я понимаю, что, должно быть, я неправильно сформулировал свой вопрос. Но я полагаю, что неразумно блокировать переключение контекста для одной задачи. Спасибо!   -  person Philip Massey    schedule 01.08.2013
comment
Без проблем. Может это я не понимаю проблемы. Если хочешь, можешь перефразировать, и я еще раз подумаю. Ваше здоровье! P.S. Если вы хотите, чтобы другой процесс ждал первого, вы можете просто использовать блокировки.   -  person freakish    schedule 01.08.2013
comment
Это приложение жесткого реального времени? Есть ли у вас строгие ограничения на то, сколько времени требуется для обработки последовательной связи, прежде чем вы начнете терять данные?   -  person Jonathan    schedule 01.08.2013


Ответы (2)


Из того, что я могу понять (при условии, что у вас нет строгих требований, чтобы мастер всегда регистрировал данные с последовательного устройства), вы просто хотите, чтобы мастер был готов дать любому работнику кусок данных и быть готовым получать данные от любого воркера, как только work=ker будет готов.

для достижения этого используйте две очереди и многопроцессорность

Многопроцессорная очередь в Python

Как использовать многопроцессорную очередь в Python?

этого должно быть достаточно для ваших нужд, если время (анализ данных) >> сбор данных

person staticd    schedule 01.08.2013

Вот один из способов реализации вашего рабочего процесса:

  1. Иметь два объекта multiprocessing.Queue: tasks_queue и results_queue. tasks_queue будет содержать выходные данные устройства, а results_queue — результаты утверждений.

  2. Имейте пул рабочих процессов, где каждый рабочий извлекает выходные данные устройства из tasks_queue, анализирует их, утверждает и помещает результат утверждения в results_queue.

  3. Поручите другому процессу постоянно опрашивать устройство и поместите выходные данные устройства в tasks_queue.

  4. Пусть последний процесс будет постоянно опрашивать results_queue и завершать всю программу, когда будет достигнуто желаемое количество результатов (успешных утверждений).

Общее количество процессов (multiprocessing.Process объектов) равно 2 + k, где k — количество рабочих процессов в пуле.

person Velimir Mlaker    schedule 03.08.2013