Python 多处理指南似乎存在冲突:共享内存还是泡菜?



我正在使用 Pythonmultiprocessing模块来在多个进程之间共享一个(只读(数组。我的目标是使用multiprocessing.Array来分配数据,然后让我的代码分叉(forkserver(,以便每个工作线程都可以直接从数组中读取来完成他们的工作。

在阅读编程指南时,我有点困惑。

首先说:

避免共享状态

应尽可能避免转移大量 进程之间的数据。

最好坚持使用队列或管道 进程之间的通信,而不是使用较低级别 同步基元。

然后,下面几行:

比泡菜/不泡菜更好继承

当使用生成或分叉服务器启动方法时,许多类型来自 多处理需要可选取,以便子进程可以使用 他们。但是,通常应避免将共享对象发送到 使用管道或队列的其他进程。相反,您应该安排 程序,以便需要访问共享资源的进程 在其他地方创建可以从祖先进程继承它。

据我了解,队列管道会腌制对象。如果是这样,这两个准则不是冲突吗?

谢谢。

第二个准则是与您的用例相关的准则。

首先是提醒您,这不是使用锁(或原子操作(操作共享数据结构的线程。 如果您对所有内容都使用Manager.dict()(实际上是SyncManager.dict(,则每次读取和写入都必须访问管理器的进程,并且您还需要线程程序的典型同步(这本身可能会因跨进程而产生更高的成本(。

第二个准则建议通过fork继承共享的只读对象;在forkserver的情况下,这意味着你必须在调用set_start_method之前创建这样的对象,因为所有worker都是当时创建的进程的子级。

关于这种共享的可用性的报告充其量是混合的,但如果您可以使用少量任何类似 C 的数组类型(如numpy或标准array模块(,您应该会看到良好的性能(因为大多数页面永远不会用于处理引用计数(。 请注意,您不需要在此处multiprocessing.Array(尽管它可能工作正常(,因为您不需要在一个并发进程中写入即可在另一个进程中可见。

相关内容

  • 没有找到相关文章

最新更新