ฉันมีสคริปต์ที่ประสบความสำเร็จในการทำชุดงานพูลหลายกระบวนการด้วยการimap_unordered()
โทร:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
อย่างไรก็ตามของฉันnum_tasks
อยู่ที่ประมาณ 250,000 ดังนั้นการjoin()
ล็อกเธรดหลักเป็นเวลา 10 วินาทีหรือมากกว่านั้นและฉันต้องการที่จะสามารถสะท้อนออกไปยังบรรทัดคำสั่งทีละน้อยเพื่อแสดงว่ากระบวนการหลักไม่ได้ถูกล็อค สิ่งที่ต้องการ:
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)
มีวิธีการสำหรับอ็อบเจ็กต์ผลลัพธ์หรือพูลที่ระบุจำนวนงานที่เหลืออยู่หรือไม่? ฉันลองใช้multiprocessing.Value
ออบเจ็กต์เป็นตัวนับ ( do_work
เรียกการcounter.value += 1
ดำเนินการหลังจากทำงานเสร็จแล้ว) แต่ตัวนับจะได้รับถึง ~ 85% ของมูลค่าทั้งหมดเท่านั้นก่อนที่จะหยุดการเพิ่มขึ้น