我想要并行运行大量的CPU限制任务。大多数这些任务将返回类似的结果,我只需要存储唯一的结果并计算非唯一的结果。
以下是当前的设计方式:我使用两个托管词典 - 一个用于结果,另一个用于结果计数器。我的任务是使用唯一的结果键检查那些词典,找到他们找到的结果,然后写入两个词典或只增加计数器以获得非唯一结果(如果我必须写,我获取锁并再次检查以避免不一致)。 / p>
我关注的是:因为Pool.map实际上应该返回结果对象,即使我没有保存对它的引用,结果仍会堆积在内存中,直到它们被垃圾回收。即使我将有数百万只无处可用(因为我以不同的方式处理结果而我的所有任务都返回None)我不能依赖特定的垃圾收集器行为,因此程序可能最终耗尽内存。我仍然希望保留池的不错功能,但忽略了这种内置的结果处理。我的理解是否正确,我的关注是否有效?如果是的话,还有其他选择吗?
此外,现在我把它放在纸上看起来很笨拙:)你有没有看到更好的设计方法呢?
谢谢!
答案 0 :(得分:0)
问题:我仍然希望保留游泳池的精彩功能
从return result
移除multiprocessing.Pool
。
从class MapResult
复制inherit
和mp.pool.ApplyResult
添加,替换,评论以下内容:
import multiprocessing as mp
from multiprocessing.pool import Pool
class MapResult(mp.pool.ApplyResult):
def __init__(self, cache, chunksize, length, callback, error_callback):
super().__init__(cache, callback, error_callback=error_callback)
...
#self._value = [None] * length
self._value = None
...
def _set(self, i, success_result):
...
if success:
#self._value[i*self._chunksize:(i+1)*self._chunksize] = result
从class myPool(Pool)
创建您自己的multiprocessing.Pool
继承
从def _map_async(...
复制multiprocessing.Pool
添加,替换,评论以下内容:
class myPool(Pool):
def __init__(self, processes=1):
super().__init__(processes=processes)
def _map_async(self, func, iterable, mapper, chunksize=None, callback=None,
error_callback=None):
...
#if self._state != RUN:
if self._state != mp.pool.RUN:
...
#return result
使用Python测试:3.4.2