Python多进程 - 如何在进程完成后释放内存?
我在使用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
等待进程完成?因为如果父进程一直在运行而不等子进程,它们就会变成 僵尸进程。