temphh 发表于 2024-8-14 15:39

python多进程共享字典无法更新求助

本帖最后由 temphh 于 2024-8-14 17:31 编辑

新手学习python编程,最近研究多进程,结果发现共享字典值无法更改,测试代码如下:

请各有有空的大佬指点一下,分析思路或具体问题均可,谢谢

醉红尘0 发表于 2024-8-14 16:33


主要就是不要对共享对象直接进行复杂操作。增加了一个中间变量(字典),用于for循环进行赋值,然后将这个中间变量的值赋给共享对象,就可以了。

temphh 发表于 2024-8-14 16:59

本帖最后由 temphh 于 2024-8-14 17:07 编辑

醉红尘0 发表于 2024-8-14 16:33
主要就是不要对共享对象直接进行复杂操作。增加了一个中间变量(字典),用于for循环进行赋值,然后将这 ...
测试发现,这样的话字典就不是共享字典了,无法在多进程中通信了呢?

MrLeopard 发表于 2024-8-14 17:08

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

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

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



根据 `Manager` 的文档((https://docs.python.org/zh-cn/3/library/multiprocessing.html#proxy-objects))。




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

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

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

      temp_dict["P1001"] = "aaa"

      shared_dict = temp_dict       # 然后赋值回去

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



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

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


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

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

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

temphh 发表于 2024-8-14 17:30

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


根据 `Manager` 的文档((https://do ...

试过了,真的可行。感谢大神{:1_919:}

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
试过了,真的可行。感谢大神

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

壹百八一杯 发表于 2024-8-15 09:13

可以用 Queue队列试试
页: [1] 2
查看完整版本: python多进程共享字典无法更新求助