美文网首页
Python 的 list 和 dict 是不是线程安全

Python 的 list 和 dict 是不是线程安全

作者: 东方胖 | 来源:发表于2022-10-11 21:14 被阅读0次

    可能有的地方是这么回答的:大部分情况是如此。但是不都是如此。
    具体的例子在官方文档中已经给出。

    但是实际上从线程安全的概念出发,上面说的虽然是对的,但也不算是正确答案。
    list 和dict 不是线程安全

    线程安全 (thread-safe) 是指支持多线程同时访问的特性,不论是否是操作共享数据
    重入(reentrant) 则是指支持多线程读,但是共同操作共享数据可能会引起值未定义的情况

    Python 的 GIL 锁保证解释器只有一个线程在运作,某些情况下,会发生线程切换,在 GIL 机制下,访问 list 和dict 的数据一般是线程安全的,但是如果进行写操作:
    比如对于列表 D

    D[i] = D[i] + 1 
    

    这条指令包含多个动作,它不是原子操作,多线程运行时,可能会发生值未定义的情况

    • 装载 D[i]
    • 将 D[i] 的值加 1
    • 将值存回 D[i]

    以下这些操作是 atomic 的:

    L.append(x)
    L1.extend(L2)
    x = L[i]
    x = L.pop()
    L1[i:j] = L2
    L.sort()
    x = y
    x.field = y
    D[x] = y
    D1.update(D2)
    D.keys()
    

    而这些不是

    i = i+1
    L.append(L[-1])
    L[i] = L[j]
    D[x] = D[x] + 1
    

    不是 atomic 时 需要上锁,保证代码被唯一的线程操作

    相关文章

      网友评论

          本文标题:Python 的 list 和 dict 是不是线程安全

          本文链接:https://www.haomeiwen.com/subject/wafzartx.html