2016-01-19 10 views
5

जब मैंने नीचे दिया गया कोड चलाया, तो स्मृति बढ़ रही थी। हालांकि अगर मैंने time.sleep(3) हटा दिया, तो top में और कभी भी वृद्धि नहीं हुई।पायथन - टाइम.sleep कारण स्मृति रिसाव क्यों करता है?

ऐसा लगता है कि process सही ढंग से समाप्त नहीं किया जा सकता है, लेकिन क्यों?

संहिता (Python 2.7.11):

import time 
import multiprocessing 

def process(): 
    #: FIXME 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 
+0

@vks आधिकारिक दस्तावेज़ ने कहा कि 'किसी को शामिल() 'https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing का उपयोग करने से पहले बंद() या समाप्त() को कॉल करना होगा। Pool.join – tanglong

+2

निम्नलिखित प्रश्न आपके लिए दिलचस्प हो सकता है: http: //stackoverflow.com/questions/7648967/python-multiprocessing-how-to-release-memory-when-a-process-is-done द्वारा उत्तर की जांच करें उपयोगकर्ता 1 9 14881: "पूल पर maxtasksperchild तर्क सेट करने का प्रयास करें। यदि आप नहीं करते हैं, तो पूल को फिर से बार-बार पुन: उपयोग किया जाता है ताकि स्मृति कभी जारी न हो। सेट होने पर, प्रक्रिया को मरने की अनुमति दी जाएगी और एक नया एक व्यक्ति की जगह में बनाया गया है। यह प्रभावी ढंग से स्मृति को साफ करेगा। " प्रक्रियाओं में थोड़ी सी मेमोरी होती है जो आपके लूप में कभी भी रिलीज़ नहीं होती है। (हालांकि मुझे यकीन नहीं है) –

+0

@RobinSpiess मैंने 'maxtasksperchild' की कोशिश की, लेकिन – tanglong

उत्तर

1

जहाँ तक मुझे पता है, मुझे लगता है कि के रूप में आप एक ही पूल में नई प्रक्रियाओं अंडे, कचरा संग्रहण, कभी नहीं किया है, ताकि आप से स्मृति जारी नहीं करते के रूप में पुरानी प्रक्रियाएं, भले ही आप उनका उपयोग कर रहे हों। एक ठीक आपके जबकि पाश में कचरा संग्रहण लागू करने के लिए होगा:

import time 
import multiprocessing 
import gc 

def process(): 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
     gc.collect() 
    pool.close() 
    pool.join() 


if __name__ == '__main__': 
    main() 

यह मेरे लिए मेमोरी लीक तय रूप में आप प्रक्रियाओं का एक और सेट शुरू करने से पहले कचरा संग्रहण के लिए मजबूर। मुझे आशा है कि कोई इस स्मृति रिसाव को करने के कारण के बारे में अधिक विस्तृत तरीके से समझा सकता है।

+0

मदद नहीं की, धन्यवाद, यह एक पक्ष है। – tanglong

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