Python多进程 - 如何在进程完成后释放内存?

34 投票
3 回答
29580 浏览
提问于 2025-04-17 03:39

我在使用Python的多进程库时遇到了一个奇怪的问题。

我的代码大致是这样的:我为每一个“符号,日期”的组合启动一个进程,然后再把结果合并在一起。

我本以为当一个进程完成了某个“符号,日期”组合的计算后,它应该会释放掉它占用的内存?但显然不是这样。我看到机器上有好几十个进程(尽管我把进程池的大小设置为7),它们处于暂停状态¹。它们不消耗CPU,但也不释放内存。

我该如何让一个进程在完成计算后释放它的内存呢?

谢谢!

¹ 这里的“暂停”是指在使用ps命令查看时,它们的状态显示为“S+”

def do_one_symbol( symbol, all_date_strings ):
    pool = Pool(processes=7)
    results = [];
    for date in all_date_strings:
        res = pool.apply_async(work, [symbol, date])
        results.append(res);

    gg = mm = ss = 0;
    for res in results:
        g, m, s = res.get()
        gg += g; 
        mm += m; 
        ss += s;

3 个回答

4

你应该先在你的 Pool 对象上调用 close(),然后再调用 wait()

http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool

join() 是用来等待工作进程结束的。在使用 join() 之前,必须先调用 close()terminate()

23

试着在池子里设置一下 maxtasksperchild 这个参数。如果不设置的话,池子会一直重复使用同一个进程,这样内存就不会被释放。当你设置了这个参数后,进程就可以结束,然后会创建一个新的进程来替代它。这样就能有效地清理内存。

我想这个功能是在 2.7 版本中新增的: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

33

你有没有试过用 pool.close 来关闭池,然后再用 pool.join 等待进程完成?因为如果父进程一直在运行而不等子进程,它们就会变成 僵尸进程

撰写回答