【问题标题】:How to properly memoize when using a ProcessPoolExecutor?使用 ProcessPoolExecutor 时如何正确记忆?
【发布时间】:2019-11-30 23:21:36
【问题描述】:

我怀疑是这样的:

@memoize
def foo():
    return something_expensive

def main():
    with ProcessPoolExecutor(10) as pool:
        futures = {pool.submit(foo, arg): arg for arg in args}
        for future in concurrent.futures.as_completed(futures):
            arg = futures[future]
            try:
                result = future.result()
            except Exception as e:
                sys.stderr.write("Failed to run foo() on {}\nGot {}\n".format(arg, e))
            else:
                print(result)

由于我使用的是多处理池并且进程共享不多,因此无法工作(假设 @memoize 是典型的基于 dict 的缓存)。至少它似乎不起作用。

在这种情况下记忆的正确方法是什么?最终,我还想将缓存腌制到磁盘并在后续运行时加载它。

【问题讨论】:

  • 你查过什么吗? sharing state 使用multiprocessing 有很多问题,或者您是否尝试过docs 中提到的任何方法?
  • 由于记忆需要存储参数和早期调用的结果——但是它已经实现了——当记忆的函数在多个进程中使用时,它不太可能工作,因为曾经有自己单独的内存-空间。这将有利于每个进程 的多次调用,但总体收益可能会降低。也就是说,IMO,您的腌制想法听起来可能值得追求,因为腌制数据可以被多个进程使用,如果每个进程都加载它。

标签: python-3.x caching python-multiprocessing memoization process-pool


【解决方案1】:

您可以使用来自 multiprocessing 的 Manager.dict,它使用 Manager 在进程之间进行代理并存储在可以腌制的共享 dict 中。我决定使用多线程,因为它是一个 IO 绑定的应用程序和线程共享内存空间意味着我不需要所有管理器的东西,我可以只使用一个字典。

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2017-02-20
    • 2019-05-29
    • 2022-01-24
    • 1970-01-01
    • 2014-01-07
    • 2012-08-02
    • 2022-11-03
    • 2019-09-17
    相关资源
    最近更新 更多