2012-06-19 12 views
5

तो क्या मैं अंत में करने के लिए कोशिश कर रहा हूँ एक पंक्ति पढ़ने के लिए है, कि लाइन में जानकारी के साथ कुछ गणना करते हैं, तो कुछ वैश्विक वस्तु के लिए परिणाम जोड़ने के लिए, लेकिन मैं इसे पाने के लिए प्रतीत नहीं कर सकते हैं काम करने के लिए। उदाहरण के लिए, नीचे दिए गए कोड में परीक्षण हमेशा 0 होता है। मुझे पता है कि यह गलत है, और मैंने इसे अन्य तरीकों से करने की कोशिश की है, लेकिन यह अभी भी काम नहीं कर रहा है।वैश्विक चर बदल रहा है जब अजगर में बहु

import multiprocessing as mp 

File = 'HGDP_FinalReport_Forward.txt' 
#short_file = open(File) 
test = 0 

def pro(temp_line): 
    global test 
    temp_line = temp_line.strip().split() 
    test = test + 1 
    return len(temp_line) 

if __name__ == "__main__": 
    with open("HGDP_FinalReport_Forward.txt") as lines: 
     pool = mp.Pool(processes = 10) 
     t = pool.map(pro,lines.readlines()) 
+2

वैश्विक आम तौर पर एक संकेत है कि आप कुछ गलत कर रहे हैं। मैं सलाह देता हूं कि आपका प्रोग्राम उनसे बचने के लिए कैसे काम करता है - यह आपको लंबे समय तक सिरदर्द बचाएगा, और हमेशा एक बेहतर तरीका है। –

+0

बहु मॉड्यूल की बात यह है कि यह एक ही प्रक्रिया में धागे बच्चे प्रक्रियाओं के बजाय spawns, सभी सामान्य तालमेल के साथ है। दुर्भाग्यवश, प्रलेखन उन ट्रेडऑफों को बिल्कुल समझाता नहीं है, मानते हैं कि आप उन्हें पहले ही जानते होंगे। आप "प्रोग्रामिंग दिशा निर्देशों" दस्तावेज में का अनुसरण हैं, तो आप समझ नहीं के साथ भाग मिल सकता है, लेकिन क्या तुम सच में सीखना चाहिए। – abarnert

उत्तर

15

पूल द्वारा उत्पन्न कार्यकर्ता प्रक्रियाओं को वैश्विक चर की अपनी प्रति प्राप्त करने और अद्यतन करने के लिए मिलता है। जब तक आप इसे स्पष्ट रूप से सेट नहीं करते हैं, तब तक वे स्मृति साझा नहीं करते हैं। सबसे आसान समाधान, test के अंतिम मूल्य मुख्य प्रक्रिया को वापस संवाद करने के लिए है जैसे वापसी मूल्य के माध्यम से। की तरह कुछ (अपरीक्षित):

def pro(temp_line): 
    test = 0 
    temp_line = temp_line.strip().split() 
    test = test + 1 
    return test, len(temp_line) 

if __name__ == "__main__": 
    with open("somefile.txt") as lines: 
     pool = mp.Pool(processes = 10) 
     tests_and_t = pool.map(pro,lines.readlines()) 
     tests, t = zip(*test_and_t) 
     test = sum(tests) 
+8

कुंजी यहाँ बात यह है कि, का उपयोग करते हुए 'multiprocessing', धागे (अच्छी तरह से, प्रक्रियाओं) राज्य का हिस्सा नहीं है। –

+2

+1 जवाब के लिए, और +1 @Lattyware। मेरी इच्छा है कि मल्टीप्रोसेसिंग प्रलेखन "थ्रेडिंग मॉड्यूल के समान एपीआई का उपयोग करने वाली प्रक्रियाओं को कैसे" करता है, इस पर थोड़ा स्पष्ट था कि "थ्रेड बनाने" से अलग है, क्योंकि इससे एसओ पर मॉड्यूल के साथ आधा समस्याएं हल हो जाएंगी ... – abarnert

+0

ग्रेट स्टफ! यह मुझे django मॉडल अद्यतन करने में मदद की। स्पष्ट रूप से कनेक्शन फोर्क नहीं किया गया है और किसी अन्य प्रक्रिया द्वारा अनुचित रूप से बंद किया जा सकता है। इसका ख्याल रखने के लिए मैंने इस दृष्टिकोण का उपयोग किया लेकिन मैंने ज़िप का उपयोग नहीं किया, मैंने सीधे लूप का उपयोग करके सूची से टुपल तत्वों तक पहुंचा, और फिर प्रत्येक सूची आइटम tuple_element [index] का उपयोग करके टुपल के माध्यम से जा रहा है। – radtek

0

यहाँ बहु के भीतर वैश्विक चर उपयोग करने के उदाहरण है।

हम स्पष्ट रूप से देख सकते हैं कि प्रत्येक प्रक्रिया चर की अपनी एक प्रतिलिपि के साथ काम करता है:

import multiprocessing 
import time 
import os 
import sys 
import random 
def worker(a): 
    oldValue = get() 
    set(random.randint(0, 100)) 
    sys.stderr.write(' '.join([str(os.getpid()), str(a), 'old:', str(oldValue), 'new:', str(get()), '\n'])) 

def get(): 
    global globalVariable 
    return globalVariable 

globalVariable = -1 
def set(v): 
    global globalVariable 
    globalVariable = v 

print get() 
set(-2) 
print get() 

processPool = multiprocessing.Pool(5) 
results = processPool.map(worker, range(15)) 

आउटपुट:

27094 0 old: -2 new: 2 
27094 1 old: 2 new: 95 
27094 2 old: 95 new: 20 
27094 3 old: 20 new: 54 
27098 4 old: -2 new: 80 
27098 6 old: 80 new: 62 
27095 5 old: -2 new: 100 
27094 7 old: 54 new: 23 
27098 8 old: 62 new: 67 
27098 10 old: 67 new: 22 
27098 11 old: 22 new: 85 
27095 9 old: 100 new: 32 
27094 12 old: 23 new: 65 
27098 13 old: 85 new: 60 
27095 14 old: 32 new: 71 
संबंधित मुद्दे