使用 concurrent.futures 多进程, 如何在进程中更新一个公共全局变量?

2021-11-02 19:51:17 +08:00
 keroppi

这个公共变量是个字典,进程中各自读取、更新作这个字典内的对应项,不会有进程同时操作同一个项,

例如:

dict_var = {
   "zhangsan":{
   		# some code
   },
   "lisi":{
   		# some code
   }
   # more items
}

# 进程 1 只会读取、更新 dict_var['zhangsan']
# 进程 2 只会读取、更新 dict_var['lisi']
1984 次点击
所在节点    Python
9 条回复
aptx4689
2021-11-02 19:54:07 +08:00
自己加个锁?
xiaofengchen
2021-11-02 20:11:52 +08:00
可以直接操作,在进程启动前声明 dict_var 就行

缺点是,进程启动后,内部只看得到启动前的 dict_var 以及自己修改的部分,其它进程修改部分是不可见的。

如果需要共享内存,参考 https://docs.python.org/zh-cn/3/library/multiprocessing.shared_memory.html
keroppi
2021-11-02 20:39:58 +08:00
@xiaofengchen 多谢多谢,看了眼,是 3.8 新版功能.难怪没印象,我去学习学习
UN2758
2021-11-03 10:16:08 +08:00
如果多个线程操作一个字典的不同字段,这可以分开成两个字典独立操作,最后合并到一起,为什么放到一起呢
UN2758
2021-11-03 10:16:50 +08:00
@UN2758 #4 线程->进程
julyclyde
2021-11-03 12:26:20 +08:00
楼上说的对
apake
2021-11-03 13:40:34 +08:00
既然各个进程 读取更新属于 各自的 变量, 为什么要放在一个 dict 里面呢. 最后处理完在合并不行么?
keroppi
2021-11-04 16:42:50 +08:00
是的,考虑到这个,换成 redis 了,各自维护 hash 中的数据
ClericPy
2021-11-04 21:04:22 +08:00
避免竞争的简单方法比如队列, 比如锁...

你这场景, 队列吧, 虽然我自己都没怎么用过多进程的队列或者 manager 那些...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812536

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX