2012-03-28 14 views
51

multiprocessing मॉड्यूल के लिए प्रलेखन दिखाता है कि multiprocessing.Process के साथ शुरू की गई प्रक्रिया में कतार कैसे पारित करें। लेकिन मैं apply_async के साथ शुरू की गई असीमित कार्यकर्ता प्रक्रियाओं के साथ एक कतार कैसे साझा कर सकता हूं? मुझे गतिशील शामिल होने या किसी और चीज की आवश्यकता नहीं है, श्रमिकों के लिए एक बार (बार-बार) अपने परिणामों को आधार पर रिपोर्ट करने का एक तरीका है। RuntimeError: Queue objects should only be shared between processes through inheritance:कई प्रक्रियाओं के बीच परिणाम कतार साझा करना

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    q = multiprocessing.Queue() 
    workers = pool.apply_async(worker, (33, q)) 

इस के साथ विफल रहता है। मैं समझता हूं कि इसका क्या अर्थ है, और मैं पिकलिंग/अनपिकलिंग (और सभी विशेष विंडोज प्रतिबंध) की आवश्यकता के बजाय विरासत की सलाह को समझता हूं। लेकिन कैसे मैं कतार को इस तरह से पास करता हूं जो काम करता है? मुझे कोई उदाहरण नहीं मिल रहा है, और मैंने कई विकल्पों की कोशिश की है जो विभिन्न तरीकों से विफल रही हैं। कृपया मदद करें?

उत्तर

73

अपनी कतार का प्रबंधन करने के लिए multiprocessing.Manager का उपयोग करने और विभिन्न श्रमिकों के लिए इसे सुलभ बनाने का प्रयास करें।

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    m = multiprocessing.Manager() 
    q = m.Queue() 
    workers = pool.apply_async(worker, (33, q)) 
+0

ऐसा हुआ, धन्यवाद! मेरे मूल कोड में एसिंक कॉल के साथ एक असंबंधित समस्या थी, इसलिए मैंने आपके उत्तर में भी फिक्स कॉपी किया। – alexis

संबंधित मुद्दे