2016-03-11 4 views
6

तो, मैं पाइथन में मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करके एक दिनचर्या तेज करने की कोशिश कर रहा हूं। मैं कई कोर के बीच काम विभाजित करके कई .csv फ़ाइलें पढ़ने के लिए सक्षम होना चाहते हैं, उसके लिए मेरे पास है:मैं पायथन में मल्टीप्रोसेसिंग से आउटपुट कैसे प्राप्त करूं?

if __name__ == '__main__': 
    for i in range(0,2): 
     p = multiprocessing.Process(target=CSVReader.csvreader, args=(string_array[i],)) 
     p.start() 

बात यह है कि यह है:

def csvreader(string): 

    from numpy import genfromtxt; 

    time,signal=np.genfromtxt(string, delimiter=',',unpack="true") 
    return time,signal 

तो मैं कह रही द्वारा इस फ़ंक्शन को कॉल करें यह किसी भी आउटपुट स्टोर नहीं करता है। मैंने ऑनलाइन सभी मंचों को पढ़ा है और देखा है कि multiprocessing.queue के साथ एक तरीका हो सकता है लेकिन मुझे यह अच्छी तरह से समझ में नहीं आता है। क्या कोई सरल और सीधा तरीका है?

+0

आप [प्रलेखन के लिए परिचय] को देखा है (https://docs.python.org/2/library/multiprocessing.html#introduction)? वास्तव में मेरे पास –

+0

है। मुझे घने कॉल करें लेकिन मैं उस जानकारी के साथ अपने प्रोग्राम को ठीक करने में असमर्थ था। – Guillermo

उत्तर

2

आपकी सर्वश्रेष्ठ शर्त multiprocessing.Queue या multiprocessing.Pipe है, जो इस समस्या के लिए बिल्कुल तैयार की गई हैं। वे आपको प्रक्रियाओं के बीच एक सुरक्षित और आसान तरीके से डेटा भेजने की अनुमति देते हैं।

यदि आप अपने csvreader फ़ंक्शन के आउटपुट को वापस करना चाहते हैं, तो आपको multiprocessing.Queue पर एक और तर्क देना चाहिए, जिसके माध्यम से डेटा मुख्य प्रक्रिया में वापस भेजा जाएगा। return मानों को इंगित करने के बजाय, उन्हें कतार पर रखें, और मुख्य प्रक्रिया उन्हें कुछ बिंदु बाद पुनर्प्राप्त कर देगी। जब प्रक्रिया उन्हें प्राप्त करने की कोशिश करता है, डिफ़ॉल्ट यह सिर्फ अवरुद्ध कर देगा (प्रतीक्षा) द्वारा जब तक वे उपलब्ध

आपका समारोह अब इस प्रकार दिखाई देगा कर रहे हैं वे तैयार नहीं हैं:

def cvsreader(string, q): 
    q.put(np.genfromtxt(string, delimiter=',', unpack="true")) 

मुख्य दिनचर्या होगा हो:

if __name__ == '__main__' 
    q = multiprocessing.Queue() 
    for i in range(2): 
     p = multiprocessing.Process(target=csvreader, args=(string_array[i], q,)) 
     p.start() 

# Do anything else you need in here 

time=np.empty(2,dtype='object') 
signal=np.empty(2,dtype='object') 
for i in range(2): 
    time[i], signal[i] = q.get() # Returns output or blocks until ready 
    # Process my output 

नोट है कि आप प्रत्येक आइटम वापस करना चाहते के लिए Queue.get() कॉल करने के लिए।

अधिक उदाहरण और जानकारी के लिए multiprocessing module पर प्रलेखन पर नज़र डालें।

+0

वहां कुछ गायब होना चाहिए, क्योंकि हर बार जब मैं इसे चलाता हूं, तो यह अटक जाता है – Guillermo

+0

आप सही हैं, मेरा संपादन देखें। आपको प्रक्रिया की 'प्रारंभ()' विधि को कॉल करना होगा। – bnaecker

+0

वास्तव में अब एक infinte पाश पर फंस गया है क्योंकि कतार में वस्तुओं का उपभोग नहीं किया जा रहा है, कोई सुझाव? – Guillermo

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