如何在多处理中同步访问共享字典
在多处理环境中,多个进程可能需要访问共享数据,例如字典。但是,如果未实现适当的同步机制,则可能会出现竞争条件,从而导致数据不可靠或损坏。
考虑这样一个场景:多个子进程在处理共享队列 Q 时访问全局字典 D。最初,该字典似乎存储子进程修改的结果。然而,一旦主进程加入 Q,字典 D 就变空了。
这个问题源于多处理的异步特性。每个子进程都有自己的内存空间,如果没有适当的同步,对共享变量所做的修改可能不会立即对其他进程可见。
使用管理器对象进行同步
在多处理中同步访问共享数据的常见解决方案是使用 Manager 对象。 Manager 提供可供所有参与进程访问的共享内存段。
以下是使用 Manager 实现同步的方法:
from multiprocessing import Process, Manager def f(d): d[1] += '1' d['2'] += 2 if __name__ == '__main__': manager = Manager() d = manager.dict() d[1] = '1' d['2'] = 2 p1 = Process(target=f, args=(d,)) p2 = Process(target=f, args=(d,)) p1.start() p2.start() p1.join() p2.join() print(d)
在此示例中,Manager 对象创建一个共享内存段字典 d,两个子进程都可以访问它。当子进程修改字典时,其他进程会立即看到更改。
输出:
$ python mul.py {1: '111', '2': 6}
此输出表明共享字典已成功由子进程同步和更新。
以上是在多处理中共享字典时如何避免竞争条件?的详细内容。更多信息请关注PHP中文网其他相关文章!