之前对 Python 理解不深,最近准备深入学习一下,在多线程和线程安全的时候碰到了一个问题。
https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe 里写到 Python 自带的数据结构的某些操作是不安全的。比如 D[x] = D[x] + 1
。
于是写了个很简单的测试:
import threading
import sys
sys.setswitchinterval(1)
d = {1:0}
def func():
d[1] += 1
threads = []
for _ in range(1000000):
t = threading.Thread(target=func)
threads.append(t)
t.start()
for thread in threads:
thread.join()
print(d)
但是跑了很多遍结果都没有问题(打印{1: 100000})。用 dis 看了一下,确实 func()也是用了多行 bytecode,按理说应该有 race condition 才对。
>>> dis.dis(func)
11 0 LOAD_GLOBAL 0 (d)
2 LOAD_CONST 1 (1)
4 DUP_TOP_TWO
6 BINARY_SUBSCR
8 LOAD_CONST 1 (1)
10 INPLACE_ADD
12 ROT_THREE
14 STORE_SUBSCR
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
不太明白问题出在哪,是 100 万不够大吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.