Python, использующий несколько процессоров - PullRequest
11 голосов
/ 29 января 2011

Допустим, у меня есть большой список музыки различной длины, которую нужно преобразовать, или изображения разных размеров, которые нужно изменить в размерах или что-то в этом роде.Порядок не имеет значения, поэтому он идеально подходит для разделения на несколько процессоров.

Если я использую multiprocessing.Pool, функция map кажется, что вся работа разделена заранее и не учитываетТот факт, что некоторые файлы могут занять больше времени, чем другие.

Что происходит, если у меня 12 процессоров ... ближе к концу обработки, 1 или 2 процессору останется 2 или 3 файла для обработки, покадругие процессоры, которые могут быть использованы, бездействуют.

Существует ли какая-либо реализация очереди, которая может поддерживать загрузку всех процессоров до тех пор, пока не останется больше работы?

Ответы [ 5 ]

6 голосов
/ 29 января 2011

Специально для этой цели в модуле multiprocessing имеется класс Queue.

Edit: Если вы ищете полную платформу для параллельных вычислений, которая имеет функцию map() с использованием очереди задач, взгляните на средства параллельных вычислений IPython . В частности, вы можете использовать функцию TaskClient.map(), чтобы получить балансировку нагрузки для доступных процессоров.

2 голосов
/ 14 марта 2011

Это просто сделать с кувшином :

def process_image(img):
     ....
images = glob('*.jpg')
for im in images:
      Task(process_image, im)

Теперь просто запустите jug execute несколько раз, чтобы запустить рабочие процессы.

1 голос
/ 29 января 2011

Библиотека потоков Python, которая принесла мне наибольшую радость, - Parallel Python (PP) . С PP легко использовать подход с пулом потоков с одной очередью для достижения того, что вам нужно.

1 голос
/ 29 января 2011

О реализации очереди. Есть некоторые.

Посмотрите на проект Celery. http://celeryproject.org/

Таким образом, в вашем случае вы можете запустить 12 преобразований (по одному на каждый ЦП) в качестве задач Celery, добавить функцию обратного вызова (для преобразования или в задачу) и в этой функции обратного вызова добавить новую задачу преобразования, выполняемую, когда предыдущих преобразований завершена.

0 голосов
/ 14 марта 2011

Это не тот случай, если вы используете Pool.imap_unordered.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...