在多处理中共享字典时如何避免竞争条件?

Linda Hamilton
发布: 2024-11-26 12:20:09
原创
437 人浏览过

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

如何在多处理中同步访问共享字典

在多处理环境中,多个进程可能需要访问共享数据,例如字典。但是,如果未实现适当的同步机制,则可能会出现竞争条件,从而导致数据不可靠或损坏。

考虑这样一个场景:多个子进程在处理共享队列 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板