2016-01-19 62 views
5

当我运行下面的代码时,内存在增加。但是,如果我删除time.sleep(3),它是0.1top并且从未增加。Python - 为什么time.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官方文档说'在使用join()'https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing之前,必须调用close()或terminate()。 Pool.join – tanglong

+2

以下问题可能会对您有所帮助:http://stackoverflow.com/questions/7648967/python-multiprocessing-how-to-release-memory-when-a-process-is-done检查答案user1914881:“试着在池中设置maxtasksperchild参数,如果你不这样做,那么这个进程会被池重复使用,所以内存永远不会被释放,当设置时,进程将被允许死掉,一个新的一个在它的位置创建,这将有效地清理内存。“这些进程似乎保留了一点内存,这在1循环中从未释放。 (虽然我不确定) –

+0

@RobinSpiess我试过'maxtasksperchild',但没有帮助 – tanglong

回答

1

据我知道,我想,当你在产卵同一池中新工艺,垃圾收集是永远做不完的,这样你就不会从内存释放旧的进程,即使你已经完成了使用它们。 一个解决将是执行垃圾收集while循环:

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