Пул многопроцессорности Python в Windows 8.1 порождает только одного рабочего
В настоящее время у меня есть этот кусок кода (не стесняйтесь комментировать его тоже:))
def threaded_convert_to_png(self):
paths = self.get_pages()
pool = Pool()
result = pool.map(convert_to_png, paths)
self.image_path = result
На Intel i7 он запускает восемь рабочих при работе в Linux; однако при запуске Windows 8.1 Pro он порождает только одного работника. Я проверил, и cpu_count()
возвращает 8 на Linux и Windows.
- Есть ли что-то, что мне не хватает здесь, или что-то не так?
- Есть ли способ исправить эту проблему?
P.S. Это в Python 2.7.6
Ответы
Ответ 1
Существует один простой способ определить, что происходит в вашем пуле, - включить многопроцессорную отладку.
Вы можете сделать это следующим образом:
import logging
from multiprocessing import util
util.log_to_stderr(level=logging.DEBUG)
И при запуске script вы получите полную информацию о запущенных, нерестах и выходе процессов.
Но каким-либо образом пул процессов всегда порождает N процессов (где значение аргумента N - "процессы" или cpu_count), но распределение задач между процессами может быть неравномерным - это зависит от времени выполнения задачи.
Ответ 2
Мне удалось решить мою аналогичную проблему. Я не уверен, что это поможет вам, но я решил записать его здесь, если это кому-то поможет.
В моем случае я анализировал огромное количество твитов (всего 52000), разделив их на несколько процессоров. Он отлично работал на OSX и на сервере, но на моей Windows 8.1 он был очень медленным, и процессы активировались последовательно. Заглянув в диспетчер задач, я заметил, что использование памяти основного процесса Python увеличилось до 1,5 ГБ. Использование памяти рабочего процесса также увеличилось. Теперь я заметил, что моя старая версия работала нормально, у которой был немного другой алгоритм. В конце концов проблема заключалась в том, что я получил целые твиты из базы данных, в то время как мне требовалась только текстовая часть твитов. Это, по-видимому, привело к росту использования памяти. После того, как я исправил эту часть, программа запустила рабочие процессы должным образом.
Поэтому, основываясь на моем опыте, я подозреваю, что Windows пытается контролировать использование ram, блокируя рабочие процессы. Если это так, проверьте использование плунжера ваших процессов. Это только предположение с моей стороны, поэтому мне интересно, если у кого-то есть лучшее объяснение.