Думаю, я упростил бы самые простые примеры, скопированные сверху, работая для меня на 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))))
С простым Processes:
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бы сделал.