我正在使用 Pythonmultiprocessing
模块来在多个进程之间共享一个(只读(数组。我的目标是使用multiprocessing.Array
来分配数据,然后让我的代码分叉(forkserver
(,以便每个工作线程都可以直接从数组中读取来完成他们的工作。
在阅读编程指南时,我有点困惑。
首先说:
避免共享状态
应尽可能避免转移大量 进程之间的数据。
最好坚持使用队列或管道 进程之间的通信,而不是使用较低级别 同步基元。
然后,下面几行:
比泡菜/不泡菜更好继承
当使用生成或分叉服务器启动方法时,许多类型来自 多处理需要可选取,以便子进程可以使用 他们。但是,通常应避免将共享对象发送到 使用管道或队列的其他进程。相反,您应该安排 程序,以便需要访问共享资源的进程 在其他地方创建可以从祖先进程继承它。
据我了解,队列和管道会腌制对象。如果是这样,这两个准则不是冲突吗?
谢谢。
第二个准则是与您的用例相关的准则。
首先是提醒您,这不是使用锁(或原子操作(操作共享数据结构的线程。 如果您对所有内容都使用Manager.dict()
(实际上是SyncManager.dict
(,则每次读取和写入都必须访问管理器的进程,并且您还需要线程程序的典型同步(这本身可能会因跨进程而产生更高的成本(。
第二个准则建议通过fork
继承共享的只读对象;在forkserver的情况下,这意味着你必须在调用set_start_method
之前创建这样的对象,因为所有worker都是当时创建的进程的子级。
关于这种共享的可用性的报告充其量是混合的,但如果您可以使用少量任何类似 C 的数组类型(如numpy
或标准array
模块(,您应该会看到良好的性能(因为大多数页面永远不会用于处理引用计数(。 请注意,您不需要在此处multiprocessing.Array
(尽管它可能工作正常(,因为您不需要在一个并发进程中写入即可在另一个进程中可见。