Этот вопрос возникает в результате попытки объединить ведение журнала с многопроцессорным пулом. Под Linux делать нечего; модуль, содержащий мой рабочий метод пула, наследует основные свойства регистратора приложений. Под Windows мне нужно инициализировать регистратор в каждом процессе, что я делаю, запустив pool.map_async с методом инициализатора. Проблема в том, что метод работает так быстро, что в одних процессах он выполняется более одного раза, а в других - нет. Я могу заставить его работать правильно, если добавлю к методу небольшую задержку, но это кажется неэлегантным.
Есть ли способ заставить пул распределять процессы равномерно?
(немного предыстории: http://plumberjack.blogspot.de/2010/09/using-logging-with-multiprocessing.html)
Код следующий, я не могу опубликовать весь модуль ;-) Вызов такой:
# Set up logger on Windows platforms
if os.name == 'nt':
_ = pool.map_async(ml.worker_configurer,
[self._q for _ in range(mp.cpu_count())])
Функция ml.worker_configurer такова:
def worker_configurer(queue, delay=True):
h = QueueHandler(queue)
root = logging.getLogger()
root.addHandler(h)
root.setLevel(logging.DEBUG)
if delay:
import time
time.sleep(1.0)
return
Конфигуратор нового воркера
def worker_configurer2(queue):
root = logging.getLogger()
if not root.handlers:
h = QueueHandler(queue)
root.addHandler(h)
root.setLevel(logging.DEBUG)
return
Pool
действительно полезен для быстрого распараллеливания, но не очень хорош, если вам нужен точный контроль над вашими процессами. - person Joel Cornett   schedule 16.11.2014get_logger
, которая сначала проверяет наличие регистратора и при необходимости настраивает его перед возвратом настроенного объекта регистратора. Этот регистратор может быть глобальным, поскольку процессы имеют отдельные среды. - person Joel Cornett   schedule 17.11.2014