这是程序:
#!/usr/bin/python
import multiprocessing
def dummy_func(r):
pass
def worker():
pass
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=16)
for index in range(0,100000):
pool.apply_async(worker, callback=dummy_func)
# clean up
pool.close()
pool.join()
我发现内存使用量(VIRT 和 RES)一直增长到 close()/join(),有什么解决方案可以解决这个问题吗?我用 2.7 尝试了 maxtasksperchild,但它也没有帮助。
我有一个更复杂的程序,它调用 apply_async() ~6M 次,在 ~1.5M 点我已经获得了 6G+ RES,为了避免所有其他因素,我将程序简化为上述版本。
编辑:
原来这个版本效果更好,感谢大家的意见:
#!/usr/bin/python
import multiprocessing
ready_list = []
def dummy_func(index):
global ready_list
ready_list.append(index)
def worker(index):
return index
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=16)
result = {}
for index in range(0,1000000):
result[index] = (pool.apply_async(worker, (index,), callback=dummy_func))
for ready in ready_list:
result[ready].wait()
del result[ready]
ready_list = []
# clean up
pool.close()
pool.join()
我没有放任何锁,因为我相信主进程是单线程的(回调或多或少像我阅读的每个文档的事件驱动的东西)。
我将 v1 的索引范围更改为 1,000,000,与 v2 相同并进行了一些测试 - 对我来说很奇怪 v2 甚至比 v1(33 秒对 37 秒)快约 10%,也许 v1 做了太多内部列表维护工作。v2绝对是内存使用的赢家,它从未超过300M(VIRT)和50M(RES),而v1曾经是370M/120M,最好的是330M/85M。所有数字只是3~4次测试,仅供参考。