Pikir saya akan menyederhanakan contoh paling sederhana yang disalin dari atas, bekerja untuk saya di Py3.6. Paling sederhana adalah multiprocessing.Pool:
import multiprocessing
import time
def worker(x):
time.sleep(1)
return x
pool = multiprocessing.Pool()
print(pool.map(worker, range(10)))
Anda dapat mengatur jumlah proses di kumpulan dengan, misalnya Pool(processes=5),. Namun standarnya adalah jumlah CPU, jadi biarkan kosong untuk tugas yang terikat CPU. (Tugas I / O-terikat sering sesuai dengan utas, karena utas sebagian besar menunggu sehingga dapat berbagi inti CPU.) PoolJuga menerapkan optimasi chunking .
(Perhatikan bahwa metode pekerja tidak dapat disarangkan dalam metode. Saya awalnya mendefinisikan metode pekerja saya di dalam metode yang membuat panggilan ke pool.map, untuk menjaga semuanya mandiri, tetapi kemudian proses tidak dapat mengimpornya, dan melemparkan "AttributeError : Tidak dapat mengasah objek lokal outer_method..inner_method ". Lebih lanjut di sini . Bisa di dalam kelas.)
(Menghargai pertanyaan asli yang ditentukan 'represent!'daripada mencetak time.sleep(), tetapi tanpa itu saya pikir beberapa kode berjalan bersamaan ketika tidak.)
Py3 ProcessPoolExecutorjuga dua baris ( .mapmengembalikan generator sehingga Anda perlu list()):
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as executor:
print(list(executor.map(worker, range(10))))
Dengan Processes polos :
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())
Gunakan SimpleQueuejika yang Anda butuhkan adalah putdan get. Loop pertama memulai semua proses, sebelum yang kedua membuat queue.getpanggilan pemblokiran . Saya tidak berpikir ada alasan untuk menelepon p.join()juga.
multiprocessing.Queue, daripada diManagersini. MenggunakanManagermembutuhkan pemijahan proses yang sama sekali baru, yang berlebihan ketikaQueueakan dilakukan.