Пул многопроцессорности 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, блокируя рабочие процессы. Если это так, проверьте использование плунжера ваших процессов. Это только предположение с моей стороны, поэтому мне интересно, если у кого-то есть лучшее объяснение.