我想使用 multiprocessing.Pool 运行任务并仅返回最小元素,而不占用内存来存储每个输出。
到目前为止我的代码:
with Pool() as pool:
programs = pool.map(task, groups)
shortest, l = min(programs, key = lambda a: len(a[0]))
这可行,但是这会占用 pool.map() 的结果的大量内存。
groups
是一个集合,它可能很大,结果会占用很多内存。
我想要这样的方法:
with Pool() as pool:
shortest, l = pool.execute_and_return_min(task, groups, key = lambda a: len(a[0]))
(内部比较结果并返回最小元素)
或:
with Pool() as pool:
shortest = l = None
for program, k in pool.apply_and_return_as_generator(task, groups):
if shortest is None or len(program) < len(shortest):
shortest = program
l = k
(它的工作方式与普通池类似,但在计算后立即从生成器返回值)
我找不到池的任何方法来实现这样的事情。由于我只想要最小元素,所以我不关心执行顺序。 可能是我搜索的时候不够仔细
如有任何帮助,我们将不胜感激。首选的是使用 Pool() 的解决方案,但如果您知道如何使用 pther 技术来实现此解决方案 - 请继续。
提前致谢!
阅读评论后,我找到了最适合我的解决方案。
imap
方法,它是 map
方法的惰性版本。
对我来说更好的是imap_unordered
,我最后选择了它。
惰性生成器的优点是它不必处理所有项目即可获得可用结果。此外,无序变体甚至更好,因为它会在值准备好后立即返回值。由于我不需要保留顺序,因此这是最佳使用方法。
最终解决方案:
with Pool() as pool:
shortest = l = None
for program, k in pool.imap_unordered(task, groups):
if shortest is None or len(program) < len(shortest):
shortest = program
l = k