python多进程共享字典无法更新求助
本帖最后由 temphh 于 2024-8-14 17:31 编辑新手学习python编程,最近研究多进程,结果发现共享字典值无法更改,测试代码如下:
请各有有空的大佬指点一下,分析思路或具体问题均可,谢谢
主要就是不要对共享对象直接进行复杂操作。增加了一个中间变量(字典),用于for循环进行赋值,然后将这个中间变量的值赋给共享对象,就可以了。 本帖最后由 temphh 于 2024-8-14 17:07 编辑
醉红尘0 发表于 2024-8-14 16:33
主要就是不要对共享对象直接进行复杂操作。增加了一个中间变量(字典),用于for循环进行赋值,然后将这 ...
测试发现,这样的话字典就不是共享字典了,无法在多进程中通信了呢?
temphh 发表于 2024-8-14 16:59
测试发现,这样的话字典就不是共享字典了,无法在多进程中通信了呢?
你可以定义一个类,比如叫class Share,在这个字典里定义字典share_dict,需要共享这个字典,直接调用Share.share_dict就好了,这个变量就是唯一的,可以多进程、多模块共享。
根据 `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()
``` FitContent 发表于 2024-8-14 17:23
根据 `Manager` 的文档((https://do ...
试过了,真的可行。感谢大神{:1_919:} 字典变量放主线程,在子线程调用的函数中直接global 变量就可以吧,用global导入一下全局变量即可 aa7088414 发表于 2024-8-14 21:57
字典变量放主线程,在子线程调用的函数中直接global 变量就可以吧,用global导入一下全局变量即可
你这是线程,进程不行 temphh 发表于 2024-8-14 17:30
试过了,真的可行。感谢大神
这种方法应该可行,冒似随着后面运行次数多和数据量大的时候,会越来越慢,建议研究共享内存方法 可以用 Queue队列试试
页:
[1]
2