Думаю, я упростил бы самые простые примеры, скопированные сверху, работая для меня на Py3.6. Самый простой это multiprocessing.Pool
:
import multiprocessing
import time
def worker(x):
time.sleep(1)
return x
pool = multiprocessing.Pool()
print(pool.map(worker, range(10)))
Вы можете установить количество процессов в бассейне с, например, Pool(processes=5)
. Тем не менее, по умолчанию используется счетчик ЦП, поэтому оставьте его пустым для задач, связанных с ЦП. (Задачи с привязкой к вводу / выводу часто все равно подходят потокам, так как потоки в основном ожидают, поэтому могут совместно использовать ядро ЦП.) Pool
Также применяется оптимизация разбиения на блоки .
(Обратите внимание, что рабочий метод не может быть вложен в метод. Сначала я определил свой рабочий метод внутри метода, который выполняет вызов pool.map
, чтобы он оставался автономным, но затем процессы не смогли его импортировать, и выдал «AttributeError». : Не могу выбрать локальный объект external_method..inner_method ". Подробнее здесь . Может быть внутри класса.)
(Оцените оригинальный вопрос, заданный печатью, 'represent!'
а не time.sleep()
, но без него я думал, что некоторый код выполнялся одновременно, когда это не так.)
Py3 также ProcessPoolExecutor
состоит из двух строк ( .map
возвращает генератор, поэтому вам нужно list()
):
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as executor:
print(list(executor.map(worker, range(10))))
С простым Process
es:
import multiprocessing
import time
def worker(x, queue):
time.sleep(1)
queue.put(x)
queue = multiprocessing.SimpleQueue()
tasks = range(10)
for task in tasks:
multiprocessing.Process(target=worker, args=(task, queue,)).start()
for _ in tasks:
print(queue.get())
Используйте, SimpleQueue
если все, что вам нужно, это put
и get
. Первый цикл запускает все процессы, прежде чем второй выполняет блокирующие queue.get
вызовы. Я не думаю, что есть причина звонить p.join()
тоже.
multiprocessing.Queue
, а неManager
здесь. ИспользованиеManager
требует запуска совершенно нового процесса, который излишним, когдаQueue
бы сделал.