मेरे पास एक स्क्रिप्ट है जो सफलतापूर्वक एक 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% हो जाता है।