gpt4 book ai didi

python - 内存使用量随着 Python 的 multiprocessing.pool 不断增长

转载 作者:IT老高 更新时间:2023-10-28 22:22:03 29 4
gpt4 key购买 nike

这是程序:

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

最佳答案

我最近遇到了内存问题,因为我多次使用多处理功能,所以它不断产生进程,并将它们留在内存中。

这是我现在使用的解决方案:

def myParallelProcess(ahugearray):
from multiprocessing import Pool
from contextlib import closing
with closing(Pool(15)) as p:
res = p.imap_unordered(simple_matching, ahugearray, 100)
return res

关于python - 内存使用量随着 Python 的 multiprocessing.pool 不断增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18414020/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com