gpt4 book ai didi

Python 多处理指南似乎与 : share memory or pickle? 冲突

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:44 25 4
gpt4 key购买 nike

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

在阅读 Programming guidelines 时我有点困惑。

首先是说:

Avoid shared state

As far as possible one should try to avoid shifting large amounts of data between processes.

It is probably best to stick to using queues or pipes for communication between processes rather than using the lower level synchronization primitives.

然后,下面几行:

Better to inherit than pickle/unpickle

When using the spawn or forkserver start methods many types from multiprocessing need to be picklable so that child processes can use them. However, one should generally avoid sending shared objects to other processes using pipes or queues. Instead you should arrange the program so that a process which needs access to a shared resource created elsewhere can inherit it from an ancestor process.

据我所知,队列管道 腌制对象。如果是这样,那这两个准则不会相互冲突吗?

谢谢。

最佳答案

第二个指南与您的用例相关。

首先要提醒您的是,这不是您使用锁(或原子操作)操作共享数据结构的线程。如果对所有的东西都使用Manager.dict()(其实就是SyncManager.dict),每次读写都要访问manager的进程,还需要同步典型的线程程序(它本身可能会因为跨进程而付出更高的代价)。

第二条准则建议通过fork 继承共享的只读对象;在 forkserver 的情况下,这意味着您必须在调用 set_start_method 之前创建此类对象,因为所有工作人员都是当时创建的进程的子进程。

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

关于Python 多处理指南似乎与 : share memory or pickle? 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50688077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com