Python - 为什么 time.sleep 会导致内存泄漏?
Python - why does time.sleep cause memory leak?
当我运行下面的代码时,内存在增加。但是,如果我删除了 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()
据我所知,我认为当您在同一个池中生成新进程时,垃圾收集永远不会完成,因此您不会从旧进程中释放内存,即使您已经使用完它们。
一种解决方法是在您的 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()
这为我解决了内存泄漏问题,因为您在启动另一组进程之前强制执行垃圾回收。
我希望有人能更详细地解释内存泄漏的原因。
当我运行下面的代码时,内存在增加。但是,如果我删除了 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()
据我所知,我认为当您在同一个池中生成新进程时,垃圾收集永远不会完成,因此您不会从旧进程中释放内存,即使您已经使用完它们。 一种解决方法是在您的 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()
这为我解决了内存泄漏问题,因为您在启动另一组进程之前强制执行垃圾回收。 我希望有人能更详细地解释内存泄漏的原因。