Python多处理准则似乎有冲突:共享内存还是pickle?
我正在使用PythonPython多处理准则似乎有冲突:共享内存还是pickle?,python,multiprocessing,fork,Python,Multiprocessing,Fork,我正在使用Pythonmultiprocessing模块在多个进程之间共享一个(只读)数组。我的目标是使用multiprocessing.Array分配数据,然后将我的代码分叉(forkserver),这样每个工作人员都可以直接从数组中读取数据来完成他们的工作 在读报纸的时候,我有点困惑 首先说的是: 避免共享状态 应尽可能避免大量移动 进程之间的数据交换 最好还是坚持使用队列或管道 流程之间的通信,而不是使用较低级别 同步原语 然后,下面几行: 继承比腌渍/拆开更好 当使用spawn或fork
multiprocessing
模块在多个进程之间共享一个(只读)数组。我的目标是使用multiprocessing.Array
分配数据,然后将我的代码分叉(forkserver
),这样每个工作人员都可以直接从数组中读取数据来完成他们的工作
在读报纸的时候,我有点困惑
首先说的是:
避免共享状态
应尽可能避免大量移动
进程之间的数据交换
最好还是坚持使用队列或管道
流程之间的通信,而不是使用较低级别
同步原语
然后,下面几行:
继承比腌渍/拆开更好
当使用spawn或forkserver启动方法时,许多类型
多处理需要可拾取,以便子进程可以使用
他们。但是,通常应避免将共享对象发送到
使用管道或队列的其他进程。相反,你应该安排
程序,以便需要访问共享资源的进程
在别处创建的进程可以从祖先进程继承它
据我所知,队列和管道会对对象进行pickle处理。如果是这样的话,这两条指导方针是否相互冲突
谢谢。第二条指南与您的用例相关 第一个是提醒您,这不是线程化,您可以使用锁(或原子操作)操作共享数据结构。如果您使用
Manager.dict()
(实际上是SyncManager.dict
)进行所有操作,则每次读写都必须访问管理器的进程,并且您还需要线程程序的典型同步(由于是跨进程的,它本身可能会付出更高的成本)
第二条准则建议通过fork
继承共享的只读对象;在forkserver的情况下,这意味着您必须在调用set_start_method
之前创建这样的对象,因为所有工作进程都是当时创建的进程的子进程
关于此类共享可用性的报告是,但如果您可以使用少量的任何类似C的数组类型(如numpy
或标准array
模块),您应该会看到良好的性能(因为绝大多数页面都不会编写来处理引用计数)。请注意,这里不需要而不需要多处理.Array
(尽管它可能工作得很好),因为您不需要在一个并发进程中的写入操作在另一个并发进程中可见