ConCurent.futures.ThreadPoolExecutor/多线程内存不足(已终止)
本文介绍了ConCurent.futures.ThreadPoolExecutor/多线程内存不足(已终止)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我目前正在做一个据说很容易的Web抓取项目,同时学习Python。我有一个大约70MB的列表,其中有几百万个IP地址(sys.argv[1])需要处理。当然,并不是所有这些服务都是可访问的。
我正在尝试使用并发。未来,但当前遇到内存问题-最终导致整个进程被终止。
现在,我已经按照here的建议将我的期货分成了两组(完成和未完成)。 我正在使用大约100个工作进程(sys.argv[2]),并且有1 GB的可用内存。
我以为所有完成的期货都会在Future.Result()被调用时被释放,并且=&>期货1000完成了?然而,它似乎只是减慢了进程(包括内存被填满,直到进程被终止)。
我在这里错过了什么?对如何处理这一问题有什么建议吗?
提前谢谢您。
我的代码如下:
推荐答案
看起来像是将完成的期货存储在一个集合中,而不是在以后清除此列表,因此它可能会变得非常大。这可能是您的记忆问题的原因。未来的.release()
方法不释放它,它仍然在done_future
列表中被引用。
不完美,但您可以尝试以下方法。它最多调度max
个作业并发执行。它定期收集已完成的工作,并重新安排新的工作。idea来自本博客。
我在此方法中看到的缺点是,它必须定期轮询max
计划的作业以查找已完成的作业,如果max
值较大,这可能会很慢。
这是一个可能对您有用的解决方法,它在我的计算机上运行了100多万次迭代,而没有使用超过150个MO。
它只是一个带有两个队列的自定义线程池,用于管理并发资源访问和限制最大并发。
这篇关于ConCurent.futures.ThreadPoolExecutor/多线程内存不足(已终止)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!