Как ограничить и поставить в очередь процессы в Python - PullRequest
0 голосов
/ 12 ноября 2018

Допустим, у меня под рукой 10000 заданий. Как я могу обрабатывать их параллельно, запустив точно 8 процессов в любое время? В момент завершения задачи следующая задача должна быть немедленно выбрана для выполнения.

for e in arr:
   pr=Process(target=execute, args=(q,e))
   pr.start()
   pr.join()

Я хочу сделать это, потому что мой ЦП имеет только 8 аппаратных потоков. Переполнение его 10000 задачами одновременно замедлит общие вычисления из-за накладных расходов на переключение. Моя память также ограничена.

( Редактировать : Это не дубликат этого вопроса , поскольку я не спрашиваю, как обработать процесс.)

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Чтобы Пул работал здесь, мне нужно также вызвать get ().

from multiprocessing import Pool
pl=[]
pool = Pool(8)
for e in arr:
   pl.append(pool.apply_async(execute, (e))
for pl2 in pl: pl2.get() 
0 голосов
/ 12 ноября 2018

Я думаю, что если вы разделите цикл for для оператора объединения, ваша проблема может быть решена. Прямо сейчас вы запускаете разветвление и хотите, чтобы результат вернулся и пошел делать еще один разветвленный процесс. И ни одна вилка не закрыта прямо сейчас.

for e in arr:
   pr=Process(target=execute, args=(q,e))
   pr.start()

for e in arr: 
   pr.join()

Или просто используйте функции пула и карты.

...