以下代码在我的Mac上的python36上打印python27上的False
和True
。
from threading import Thread
def make_huge_list(amount):
my_list = []
def add_num(num):
my_list.append(num)
threads = [Thread(target=add_num, args=(i,)) for i in range(amount)]
for t in threads:
t.start()
for t in threads: t.join()
return my_list
if __name__ == '__main__':
# check the output is ordered
print(make_huge_list(100000) == list(range(100000)))
我知道在python3中添加了GIL改进以获得更好的调度/公平性。我很困惑这个代码如何/为什么在python36上打印True
。
在Python3.2中,GIL处理已更改(阅读更多here)
主要影响上述代码的更改是在发布后重新获取GIL的方式。
在更改之前python会释放GIL并且所有线程都会为它而战,这意味着在主线程创建线程之后它释放GIL并尝试重新获取它,这意味着时间表可能看起来像这样
M - > T1 - > Mt - > Tt - > Mt - > Mt - > T4 - > Mt.
在python3.2中,一个线程释放GIL并指示其他线程接受它,因此它不会再次获取GIL,时间表将如下所示:
米 - > T1 - >米 - >米 - >米 - >米 - >米 - >破伤风......
只有两个线程同时处于活动状态:)