Saya memiliki skrip yang berhasil melakukan kumpulan tugas multiprosesing dengan imap_unordered()
panggilan:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Namun, saya num_tasks
sekitar 250.000, jadi join()
utas utama terkunci selama 10 detik atau lebih, dan saya ingin dapat menggema ke baris perintah secara bertahap untuk menunjukkan bahwa proses utama tidak terkunci. Sesuatu seperti:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
while (True):
remaining = rs.tasks_remaining() # How many of the map call haven't been done yet?
if (remaining == 0): break # Jump out of while loop
print "Waiting for", remaining, "tasks to complete..."
time.sleep(2)
Apakah ada metode untuk objek hasil atau kumpulan itu sendiri yang menunjukkan jumlah tugas yang tersisa? Saya mencoba menggunakan multiprocessing.Value
objek sebagai penghitung ( do_work
memanggil counter.value += 1
tindakan setelah melakukan tugasnya), tetapi penghitung hanya mencapai ~ 85% dari total nilai sebelum berhenti menambah.