【问题标题】:Python - why does time.sleep cause memory leak?Python - 为什么 time.sleep 会导致内存泄漏?
【发布时间】:2016-01-19 10:17:56
【问题描述】:

当我运行下面的代码时,内存在增加。但是,如果我删除了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官方文档说One must call close() or terminate() before using join()docs.python.org/2/library/…
  • 您可能会感兴趣以下问题:stackoverflow.com/questions/7648967/… 检查 user1914881 的答案:“尝试在池上设置 maxtasksperchild 参数。如果不这样做,则该过程会一遍又一遍地重用“这些进程似乎拥有一些内存,这些内存在您的 while 1 循环中从未释放。 (虽然我不确定)
  • @RobinSpiess 我试过maxtasksperchild,但没有帮助

标签: python python-2.7 memory-leaks multiprocessing


【解决方案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()

这为我解决了内存泄漏问题,因为您在启动另一组进程之前强制进行垃圾收集。 我希望有人可以更详细地解释导致此内存泄漏的原因。

【讨论】:

  • 谢谢,帮了大忙。
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多