2012-06-13 18 views
5

मैं अपने प्रक्रियाओं के बीच एक शब्दकोश साझा करना चाहते हैं इस प्रकार है जो शब्दकोश साझा करने:अजगर समानांतर प्रक्रियाओं

def f(y,x): 
    y[x]=[x*x]               

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    inputs = range(10) 
    y={}        
    result = pool.map(f,y,inputs) 

y रिटर्न {}। मैं इसे कैसे कारगर बना सकता हूं?

धन्यवाद,

+1

यह रेडिस के लिए नौकरी की तरह लगता है! –

+0

रेडिस क्या है ?? – Amir

+2

http://www.google.com/search?q=redis –

उत्तर

9

यह लगता है कि आप multiprocessing मॉड्यूल का उपयोग कर रहे हैं। आपने यह नहीं कहा, और यह जानकारी का एक महत्वपूर्ण हिस्सा है।

.map()multiprocessing.Pool() पर फ़ंक्शन दो तर्क लेता है: एक फ़ंक्शन, और अनुक्रम। समारोह अनुक्रम से लगातार मूल्यों के साथ बुलाया जाएगा। आप y और एक अनुक्रम पास करने की कोशिश कर रहे हैं और यह काम नहीं करेगा।

आप इस तरह एक अनुक्रम बना सकते हैं: ((y, x) for x in input), और एक फ़ंक्शन लिखें जो एक तर्क, एक ट्यूपल लेता है, और फिर इसके साथ सही काम करता है।

मैंने डिस्क फ़ाइलों को पढ़ने और लिखने वाली प्रक्रियाओं को चलाने के लिए केवल multiprocessing.Pool() का उपयोग किया है, इसलिए मुझे यकीन नहीं है कि बुनियादी विचार यहां कैसे काम करेगा: मुझे यकीन नहीं है कि आप ऐसा करने की कोशिश कर रहे हैं जैसे आप एक ऐसा वाक्य बदल सकते हैं ।

मैं आपके फ़ंक्शन से मूल्यों को वापस पास करने की अनुशंसा करता हूं, फिर अपना अंतिम परिणाम बनाने के लिए उन्हें एकत्रित करता हूं। मैं तो बस इस कोड का परीक्षण किया और यह काम करता है:

import multiprocessing as mp 

def f(x): 
    return (x, x*x) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    result = dict(pool.map(f, inputs)) 

result पर सेट है: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

की यह इतना है कि बजाय कंप्यूटिंग x*x की बदलें कि यह कुछ सत्ता में x बढ़ा देंगे, और बिजली प्रदान की जाएगी। और चलिए इसे एक स्ट्रिंग कुंजी तर्क लेते हैं। इसका मतलब है कि f() को एक ट्यूपल तर्क लेने की आवश्यकता है, जहां ट्यूपल (key, x, p) होगा और यह x**p की गणना करेगा।

import multiprocessing as mp 

def f(tup): 
    key, x, p = tup # unpack tuple into variables 
    return (key, x**p) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    inputs = [("1**1", 1, 1), ("2**2", 2, 2), ("2**3", 2, 3), ("3**3", 3, 3)] 
    result = dict(pool.map(f, inputs)) 

आप कई दृश्यों है और आप उन्हें एक साथ शामिल होने के लिए ऊपर के लिए एक एकल अनुक्रम बनाने के लिए की जरूरत है, zip() या शायद itertools.product का उपयोग कर इस पर गौर।

+0

मैं एफ में एक और तर्क कैसे जोड़ सकता हूं? मैंने def f (x, i): .... और फिर pool.map (f, inputs, 1) किया था, लेकिन पायथन इसे पसंद नहीं करता है। यह f() को वापस देता है (2) वास्तव में 2 तर्क लेता है – Amir

+1

'pool.map()' एक फ़ंक्शन और अनुक्रम लेता है। अनुक्रम tuples या सूचियों का एक अनुक्रम हो सकता है, और यह होगा कि आप अतिरिक्त तर्क कैसे पारित करेंगे। मैं एक और उदाहरण जोड़ूंगा। – steveha

+1

यदि आप वास्तव में प्रक्रियाओं के बीच साझा शब्दकोश चाहते हैं, तो multiprocessing मॉड्यूल में Manager.dict पर एक नज़र डालें। – danielm

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