Этот вопрос возникает в результате попытки объединить протоколирование с многопроцессорным пулом. Под Linux нечего делать; модуль, содержащий мой рабочий метод пула, наследует основные свойства журнала приложения. В Windows я должен инициализировать регистратор в каждом процессе, что я делаю, запустив pool.map_async с помощью метода initializer. Проблема в том, что метод работает так быстро, что он запускается несколько раз в некоторых процессах, а не в других. Я могу заставить его работать правильно, если добавить короткий метод времени, но это кажется неэлегантным.Распределение сил пула многопроцессорности пула процесса
Есть ли способ заставить пул распределить процессы равномерно?
(некоторые фон: 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
Новый рабочий configurer
def worker_configurer2(queue): root = logging.getLogger() if not root.handlers: h = QueueHandler(queue) root.addHandler(h) root.setLevel(logging.DEBUG) return
Как выглядит ваш код? –
Добавлен к моему вопросу. –
«Пул» действительно полезен для быстрой распараллеливания, но не очень хорош, если вы хотите мелкозернистый контроль над своими процессами. –