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