2011-10-04 11 views
20

मुझे पाइथन मल्टीप्रोसेसिंग लाइब्रेरी का उपयोग करते समय एक अजीब समस्या का सामना करना पड़ा।पायथन मल्टीप्रोसेसिंग - प्रक्रिया पूरी होने पर स्मृति को कैसे रिलीज़ किया जाए?

मेरा कोड नीचे स्केच किया गया है: मैं प्रत्येक "प्रतीक, दिनांक" tuple के लिए एक प्रक्रिया उत्पन्न करता हूं। मैं परिणामों को बाद में जोड़ता हूं।

मुझे उम्मीद है कि जब एक प्रक्रिया ने "प्रतीक, तिथि" tuple के लिए कंप्यूटिंग की है, तो इसे अपनी याददाश्त जारी करनी चाहिए? जाहिर है कि यह मामला नहीं है। मैं दर्जनों प्रक्रियाओं को देखता हूं (हालांकि मैंने प्रक्रिया पूल को आकार 7 रखने के लिए सेट किया है) जो मशीन में निलंबित हैं। वे कोई सीपीयू उपभोग नहीं करते हैं, और वे स्मृति जारी नहीं करते हैं।

इसकी गणना करने के बाद, मैंने प्रक्रिया को अपनी याददाश्त कैसे जारी कर दी है?

धन्यवाद!

¹ द्वारा "निलंबित" मेरा मतलब है ps आदेश में अपनी स्थिति के रूप में दिखाया गया है "एस +"

def do_one_symbol(symbol, all_date_strings): 
    pool = Pool(processes=7) 
    results = []; 
    for date in all_date_strings: 
     res = pool.apply_async(work, [symbol, date]) 
     results.append(res); 

    gg = mm = ss = 0; 
    for res in results: 
     g, m, s = res.get() 
     gg += g; 
     mm += m; 
     ss += s; 

उत्तर

22

आप pool.close का उपयोग करके पूल बंद करने के लिए और फिर pool.join से खत्म करने के लिए प्रक्रिया के लिए प्रतीक्षा करें, क्योंकि अगर माता-पिता चल रही प्रक्रिया को रहती है और बच्चे की प्रक्रिया के लिए प्रतीक्षा नहीं है कि वे बन zombies

+0

यह मेरी स्क्रिप्ट का मूल कारण> 4 जीबी स्मृति के 90% का सेवन कर रहे थे की वजह से नोड रिबूट की वजह से था :) धन्यवाद! –

3

आप शायद फोन close() अपने Pool वस्तु पर wait() द्वारा पीछा किया जाना चाहिए।

http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool

कार्यकर्ता प्रक्रियाओं से बाहर निकलने के लिए

join() प्रतीक्षा। किसी को शामिल() का उपयोग करने से पहले बंद() या समाप्ति() को कॉल करना होगा।

11

सेट करने का प्रयास होगा की कोशिश किया पूल पर maxtasksperchild तर्क। यदि आप नहीं करते हैं, तो पूल द्वारा बार-बार प्रक्रिया को फिर से शुरू किया जाता है ताकि स्मृति कभी जारी न हो। सेट करते समय, प्रक्रिया को मरने की अनुमति दी जाएगी और इसके स्थान पर एक नया बनाया जाएगा। यह प्रभावी ढंग से स्मृति को साफ करेगा।

मुझे लगता है कि यह 2.7 में नया क्या है: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

+0

मैं इस दृष्टिकोण का उपयोग कर रहा हूं, ठीक काम करता है। सवाल यह है कि, यह स्मृति क्यों जारी नहीं करता है? या शायद पर्याप्त तेज़ नहीं ... ?? – Elvin

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