吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 655|回复: 14
收起左侧

[已解决] python多进程共享字典无法更新求助

[复制链接]
temphh 发表于 2024-8-14 15:39
本帖最后由 temphh 于 2024-8-14 17:31 编辑

新手学习python编程,最近研究多进程,结果发现共享字典值无法更改,测试代码如下:
微信图片_20240814153632.png
请各有有空的大佬指点一下,分析思路或具体问题均可,谢谢

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

醉红尘0 发表于 2024-8-14 16:33
微信截图_20240814163118.png
主要就是不要对共享对象直接进行复杂操作。增加了一个中间变量(字典),用于for循环进行赋值,然后将这个中间变量的值赋给共享对象,就可以了。

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
~零度 + 2 + 1 我很赞同!
temphh + 1 感谢指点,我试试看

查看全部评分

 楼主| temphh 发表于 2024-8-14 16:59
本帖最后由 temphh 于 2024-8-14 17:07 编辑
醉红尘0 发表于 2024-8-14 16:33
主要就是不要对共享对象直接进行复杂操作。增加了一个中间变量(字典),用于for循环进行赋值,然后将这 ...

测试发现,这样的话字典就不是共享字典了,无法在多进程中通信了呢?
aa.png
MrLeopard 发表于 2024-8-14 17:08
temphh 发表于 2024-8-14 16:59
测试发现,这样的话字典就不是共享字典了,无法在多进程中通信了呢?

你可以定义一个类,比如叫class Share,在这个字典里定义字典share_dict,需要共享这个字典,直接调用Share.share_dict就好了,这个变量就是唯一的,可以多进程、多模块共享。

免费评分

参与人数 1吾爱币 +1 收起 理由
temphh + 1 热心回复!我试试

查看全部评分

FitContent 发表于 2024-8-14 17:23

根据 Manager 的文档(multiprocessing --- 基于进程的并行 — Python 3.12.4 文档)。

image-20240814170621195.png

所以修改那个进程执行的函数。

def update_shared_dict(shared_dict, lock):
    with lock:
        print("原字典:", shared_dict)

        temp_dict = shared_dict[1]        # 先单独拿出来进行修改

        temp_dict["P1001"] = "aaa"

        shared_dict[1] = temp_dict       # 然后赋值回去

        print("更新后字典:", shared_dict)

也可以使用嵌套的 manager,就像这样。

def update_shared_dict(shared_dict, lock):
    with lock:
        print("原字典:", shared_dict[1]["P1001"])
        # 这里不需要变动
        shared_dict[1]["P1001"] = "aaa"
        print("更新后字典:", shared_dict[1]["P1001"])

if __name__ == "__main__":
    manager = Manager()
    lock = Lock()
    shared_dict = manager.dict()

    for index in range(3):
        # 注意这里,创建的是 manager.dict
        shared_dict[index] = manager.dict({"P1001": "0", "P1002": "0", "P1003": "0"})

    p = Process(target=update_shared_dict, args=(shared_dict, lock))
    p.start()
    p.join()

免费评分

参与人数 1热心值 +1 收起 理由
temphh + 1 谢谢@Thanks!

查看全部评分

 楼主| temphh 发表于 2024-8-14 17:30
FitContent 发表于 2024-8-14 17:23
[md]

根据 `Manager` 的文档([multiprocessing --- 基于进程的并行 — Python 3.12.4 文档](https://do ...

试过了,真的可行。感谢大神
aa7088414 发表于 2024-8-14 21:57
字典变量放主线程,在子线程调用的函数中直接global 变量就可以吧,用global导入一下全局变量即可
lizy169 发表于 2024-8-15 08:08
aa7088414 发表于 2024-8-14 21:57
字典变量放主线程,在子线程调用的函数中直接global 变量就可以吧,用global导入一下全局变量即可

你这是线程,进程不行
lizy169 发表于 2024-8-15 08:10
temphh 发表于 2024-8-14 17:30
试过了,真的可行。感谢大神

这种方法应该可行,冒似随着后面运行次数多和数据量大的时候,会越来越慢,建议研究共享内存方法

免费评分

参与人数 1吾爱币 +1 收起 理由
temphh + 1 热心回复!

查看全部评分

壹百八一杯 发表于 2024-8-15 09:13
可以用 Queue队列试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 16:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表