0

Мой код получает уведомление о событиях, и я использовал для обработки событий, как только я их получу. Раньше он был однопоточным, но уведомление о событиях было довольно быстрым для их обработки. Я изменил свой код, чтобы использовать многопроцессорность с помощью пула. Вот что я сделал- многопроцессор. Использование всех моих процессов?

  • создал Pool = multiprocessing.pool(processes=4) (я могу обрабатывать максимум 11 ядер)
  • добавлять события в бассейн для асинхронного - pool.apply_async(go, ["event-1"])

, что все, что я сделал. Простым способом я добавляю события в пул, и пул будет обработан 4 процессами. Теперь мой вопрос.

  • Как я могу проверить, что мои события обрабатываются, используя все 4 процесса? Я начинаю свой планировщик каждый воскресенья, понедельник в порядке, во вторник я все еще вижу, что события в понедельник обрабатываются, в среду число растет, многие события вторника обрабатываются в среду и т. Д.

Я в основном Java парень, мне трудно понять, как python внутренне обрабатывает мои события. Я мог бы просто увеличить процессы, но я не уверен, что это помогает?

Мое основное требование

  • зарегистрироваться себя за событиями, и хотел бы обрабатывать каждое событие
  • Я хотел бы обрабатывать события в отдельном процессе, так основной процесс/нить еще продолжать прослушивание новых событий
  • Я не беспокоюсь о результате обработанного события. (но pool.apply_async(func1,["event1"]) возвращает значения)

Пожалуйста, помогите мне заполнить некоторые мысли?

ответ

2

Pool.apply помещает событие в очередь пула и первый бесплатный процесс для его захвата выполняет go(event).

Простой способ выяснить, какой процесс выполняет то, что нужно добавить в систему для работы с go.

import logging 
import os 

def go(event): 
    logging.info("process: %d, event: %r", os.getpid, event) 
    #do actual processing 

Сколько процессов вы хотите в вашем бассейне, зависит от того, какая у вас рабочая нагрузка. Если ваши рабочие места тяжелые CPU, рабочий пул, превышающий количество ядер, не поможет. Однако, если ваше узкое место является IO, вы, вероятно, можете выиграть от большего числа работников, и вам следует рассмотреть возможность переключения на потоки (см. multiprocessing.pool.ThreadPool).