Python - 为什么time.sleep会导致内存泄漏?

6
当我运行下面的代码时,内存使用量在增加。但是如果我删除了time.sleep(3),那么在top中显示的内存使用量为0.1,并且不会增加。
似乎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()

@vks 官方文档中提到:“在使用 join() 之前,必须调用 close() 或 terminate()。” https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.join - tanglong
2
以下问题可能对您有兴趣:https://dev59.com/hWsz5IYBdhLWcg3wy7LU,请查看用户1914881的答案:“尝试在池上设置maxtasksperchild参数。如果不设置,则进程将由池一遍又一遍地重复使用,因此内存永远不会被释放。当设置时,进程将被允许死亡并在其位置创建一个新进程。这将有效地清理内存。”进程似乎会保留一些内存,这些内存在while 1循环中永远不会被释放。(虽然我不确定) - Robin Spiess
@RobinSpiess 我尝试了 maxtasksperchild,但没有帮助。 - tanglong
1个回答

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()

这对我来说解决了内存泄漏问题,因为在启动另一组进程之前强制进行垃圾回收。 希望有人能更详细地解释这种内存泄漏的原因。

谢谢,它帮了个忙。 - tanglong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接