Думав, що я спрощу найпростіші приклади, скопійовані згори, працюючи для мене на 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's 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робитиме.