python processpoolexector 释放内存_使用Python的multiprocessing.pool,内存使用量不断增长...

这是程序:

#!/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快〜10%(33s vs 37s),也许v1做了太多的内部列表维护工作. v2绝对是内存使用的赢家,它从未超过300M(VIRT)和50M(RES),而v1曾经是370M / 120M,最好是330M / 85M.所有数字仅为3~4次测试,仅供参考.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值