当前位置: 首页 > 面试题库 >

在Python中对线程使用全局字典

阎令
2023-03-14
问题内容

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

我有一个全球性的词典foo多线程与IDS id1id2,…
idnfoo如果已知每个线程只能使用其与ID相关的值,比如说with
withid1只能使用它,则可以在不为其分配锁的情况下访问和更改其值,可以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中的测试/设置不是原子的(“检查时间/使用时间”竞争条件)。因此,通常最好将其锁定:

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代码示例是: 我不知道如何让两个线程共享一个变量。 问题答案: 您只需要在中声明为global ,这样就无需修改该函数本地的。 在中,您不需要执行任何特殊操作,只要您不尝试修改的值(这将创建一个局部变量以遮盖全局变量;请在需要时使用)>

  • 问题内容: 我有一堂课,有一本字典 我正在运行4个线程(每个餐厅一个线程)来调用方法。这是每个线程运行的函数: 这样安全吗,还是在致电之前必须使用锁? 问题答案: Python的内置结构对于单个操作是线程安全的,但是有时很难看到一条语句真正变成了多个操作。 您的代码应该是安全的。注意:这里的锁几乎不会增加任何开销,并且让您高枕无忧。 http://effbot.org/pyfaq/what-kin

  • 问题内容: 如何在函数中创建或使用全局变量? 如果在一个函数中创建全局变量,如何在另一个函数中使用该全局变量?我是否需要将全局变量存储在需要对其进行访问的函数的局部变量中? 问题答案: 你可以在其他函数中使用全局变量,方法是像在分配给它的每个函数中一样声明它: 我想这是因为全局变量是如此危险,因此Python希望通过显式要求使用关键字来确保您真正知道这就是要使用的内容。

  • 问题内容: 我试图了解Python中的线程。我看过文档和示例,但坦率地说,许多示例过于复杂,我难以理解它们。 你如何清楚地显示为多线程而划分的任务? 问题答案: 我将在下面进行总结-最终仅是几行代码: 这是以下内容的多线程版本: 描述 Map是一个很棒的小功能,是轻松将并行性注入Python代码的关键。对于那些不熟悉的人来说,地图是从Lisp等功能语言中提炼出来的。它是将另一个功能映射到序列上的功

  • 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。 见Python 最难的问题 解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切