我正在研究并尝试了解 python GIL 以及在 python 中使用多线程的最佳实践。我发现这个演示文稿 https://www.dabeaz.com/python/UnderstandingGIL.pdf and 这个视频 https://www.youtube.com/watch?v=Obt-vMVdM8s
我试图重现演示文稿前 4 张幻灯片中提到的奇怪而疯狂的问题。视频中(前4分钟)讲师也提到了这个问题。
我写了这个简单的代码来重现问题
from threading import Thread
from time import time
BIG_NUMBER = 100000
count = BIG_NUMBER
def countdown(n):
global count
for i in range(n):
count -= 1
start = time()
countdown(count)
end = time()
print('Without Threading: Final count = {final_n}, Execution Time = {exec_time}'.format(final_n=count, exec_time=end - start))
count = BIG_NUMBER
a = Thread(target=countdown, args=(BIG_NUMBER//2,))
b = Thread(target=countdown, args=(BIG_NUMBER//2,))
start = time()
a.start()
b.start()
a.join()
b.join()
end = time()
print('With Threading: Final count = {final_n}, Execution Time = {exec_time}'.format(final_n=count, exec_time=end - start))
但结果与论文和视频完全不同!
使用线程和不使用线程的执行时间几乎相同。有时,两种情况中的一种比另一种快一些。
这是我在 Windows 10 下使用多核架构处理器使用 CPython 3.7.3 得到的结果。
Without Threading: Final count = 0, Execution Time = 0.02498459815979004
With Threading: Final count = 21, Execution Time = 0.023985862731933594
另外,根据视频和论文,我了解到 GIL 阻止两个内核同时真正并行执行两个线程。所以如果这是真的,为什么最终计数变量(在多线程情况下)不按预期为零,并且在每次执行结束时可能由于同时操作线程而成为不同的数字?
在比视频和论文(使用 python 3.2)更新的 python 中,GIL 发生了什么变化导致这些不同吗?
提前致谢