我正在研究并试图理解pythongil和在python中使用多线程的最佳实践。我找到了this presentation和{a2}
我试图重现演示文稿前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))
但结果与纸和视频完全不同!
有线程和没有线程的执行时间几乎相同。有时两种情况中的一种比另一种快一些。在
这是我在Windows10下使用CPython3.7.3,使用多核架构处理器得到的结果。在
^{pr2}$
另外我根据视频和论文的理解是GIL阻止了两个线程同时在两个内核中并行执行。如果这是真的,那么为什么final count变量(在多线程的情况下)不是如预期的那样为零,并且在每次执行结束时都是一个不同的数字,这可能是因为同时操作了线程?
比起视频和报纸(使用Python3.2)来说,在新的pythons中GIL会发生什么变化吗?
提前谢谢