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.) Pool
Juga 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 ProcessPoolExecutor
juga dua baris ( .map
mengembalikan generator sehingga Anda perlu list()
):
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as executor:
print(list(executor.map(worker, range(10))))
Dengan Process
es 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 SimpleQueue
jika yang Anda butuhkan adalah put
dan get
. Loop pertama memulai semua proses, sebelum yang kedua membuat queue.get
panggilan pemblokiran . Saya tidak berpikir ada alasan untuk menelepon p.join()
juga.
multiprocessing.Queue
, daripada diManager
sini. MenggunakanManager
membutuhkan pemijahan proses yang sama sekali baru, yang berlebihan ketikaQueue
akan dilakukan.