2012-02-13 8 views
6

मुझे लगता है कि मैं पाइथन दस्तावेज का सही ढंग से अनुसरण कर रहा हूं लेकिन मुझे परिणाम मिलने में परेशानी हो रही है। मैं मूल रूप से संख्याओं की एक सूची है, जो लूप के लिए नेस्टेड के एक समारोह में पारित किया जा रहा है और आउटपुट को एक शब्दकोश में सहेजा जाता है।मैं मल्टीप्रोसेसिंग के साथ साझा शब्दकोश का उपयोग कैसे कर सकता हूं?

{1: 9801, 2: 9801, 3: 9801, 10: 9801} 

मैं गलत क्या कर रहा की कोई सुझाव:

from multiprocessing import Pool, Manager 

list = [1,2,3,10] 
dictionary = {} 
def test(x, dictionary): 
    for xx in range(100): 
     for xxx in range(100): 
      dictionary[x]=xx*xxx 



if __name__ == '__main__': 
    pool = Pool(processes=4) 
    mgr = Manager() 
    d = mgr.dict() 
    for N in list: 
     pool.apply_async(test, (N, d)) 

    # Mark pool as closed -- no more tasks can be added. 
    pool.close() 

    # Wait for tasks to exit 
    pool.join() 

    # Output results 
    print d 

यहाँ अपेक्षित परिणाम है:

यहाँ कोड है? साथ ही, मैंने खुद को आश्वस्त नहीं किया है कि साझा संसाधन सर्वोत्तम दृष्टिकोण हैं (राज्य को बनाए रखने के लिए डेटाबेस का उपयोग करने की सोच) ताकि अगर मेरा दृष्टिकोण पूरी तरह से त्रुटिपूर्ण हो या पाइथन में ऐसा करने का बेहतर तरीका है तो कृपया मुझे बताएं।

उत्तर

3

बदलें test करने की परिभाषा:

def test(x, d): 
    for xx in range(100): 
     for xxx in range(100): 
      d[x]=xx*xxx 

नहीं तो आप बस कुछ वैश्विक dictionary (तुल्यकालन के बिना) और कभी नहीं यह बाद में एक्सेस incrementing रहे हैं।


सामान्य दृष्टिकोण के रूप में, मुझे लगता है कि यह विशेष रूप से साझा शब्दकोश पर बहुत अधिक विवाद है। क्या आप वास्तव में को प्रत्येक प्रक्रिया से इसे जल्द से जल्द अपडेट करना है? प्रत्येक प्रक्रिया में आंशिक परिणामों के बैच जमा करना और थोड़ी देर में साझा ऑब्जेक्ट को अपडेट करना बेहतर प्रदर्शन करना चाहिए।

+0

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

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

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