【问题标题】:shared data utilizing multiple processor in python在 python 中利用多处理器共享数据
【发布时间】:2010-01-26 00:51:22
【问题描述】:

我有一个 cpu 密集型代码,它使用繁重的字典作为数据(大约 250M 数据)。我有一个多核处理器并想利用它,以便我一次可以运行多个任务。字典大多是只读的,可能每天更新一次。
如何在不复制字典的情况下用 python 编写这个?
我知道 python 线程不使用本机线程并且不会提供真正的并发性。我可以使用多处理模块而不在进程之间序列化数据吗?

我来自 java 世界,我的要求是可以共享数据、在多个处理器上运行并提供同步原语的 java 线程。

【问题讨论】:

    标签: python concurrency shared-memory


    【解决方案1】:

    您可以简单地使用 fork 在进程之间共享只读数据(在 Unix 上;在 Windows 上没有简单的方法),但这不会赶上“一天一次的变化”(你需要放一个每个进程都有明确的方式来更新自己的副本)。像 dict 这样的原生 Python 结构并非设计用于共享内存中的任意地址(您必须在 C 中编写支持该地址的 dict 变体),因此它们无法提供任何安慰。

    您可以使用 Jython(或 IronPython)获得具有与 Java(或分别为 C#)完全相同的多线程能力的 Python 实现,包括多个同时线程的多处理器使用。

    【讨论】:

      【解决方案2】:

      使用shelve 作为字典。由于写入很少,因此共享它应该没有问题。

      【讨论】:

      • 从文档看来,取值将使用pickle返回数据副本?对我来说,一项任务通常会访问 1/3 的 dict,这意味着在这种方法中会有很多临时对象
      • 那么 CPython 中没有很好的解决方案来解决您的问题。只有一系列不太糟糕的,都涉及某种数据库。
      【解决方案3】:

      在标准库中看看这个: http://docs.python.org/library/multiprocessing.html 有许多很棒的功能可以让您在进程之间非常轻松地共享数据结构。

      【讨论】:

        猜你喜欢
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 2022-11-12
        • 2023-03-10
        • 2021-06-23
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多