美文网首页
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