gpt4 book ai didi

python - 在 Python 中使用带线程的全局字典

转载 作者:IT老高 更新时间:2023-10-28 21:59:03 39 4
gpt4 key购买 nike

访问/更改字典值是线程安全的吗?

我有一个全局字典 foo 和多个 ID 为 id1id2、...、idn 的线程>。如果知道每个线程只能使用其 id 相关值(例如带有 id1 的线程),是否可以访问和更改 foo 的值而不为其分配锁> 仅适用于 foo[id1]?

最佳答案

假设 CPython:是和否。从共享字典中获取/存储值实际上是安全的,因为多个并发读/写请求不会破坏字典。这是由于实现维护的全局解释器锁(“GIL”)。那就是:

线程 A 正在运行:

a = global_dict["foo"]

线程 B 运行:

global_dict["bar"] = "hello"

线程 C 运行:

global_dict["baz"] = "world"

不会损坏字典,即使所有三个访问尝试“同时”发生。解释器将以某种未定义的方式序列化它们。

但是,以下序列的结果是不确定的:

线程 A:

if "foo" not in global_dict:
global_dict["foo"] = 1

线程 B:

global_dict["foo"] = 2

因为线程 A 中的测试/设置不是原子的(“检查时间/使用时间”竞争条件)。所以,如果你 lock things :

from threading import RLock

lock = RLock()

def thread_A():
with lock:
if "foo" not in global_dict:
global_dict["foo"] = 1

def thread_B():
with lock:
global_dict["foo"] = 2

关于python - 在 Python 中使用带线程的全局字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1312331/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com