以下代码在 Mac 上的 python36 和 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
的方式/原因感到困惑。
答案 0 :(得分:1)
在Python3.2中,GIL处理已更改(阅读更多here)
主要影响上述代码的变化是在发布后重新获取GIL的方式。
在更改之前python会释放GIL并且所有线程都会为它而战,这意味着在主线程创建线程之后它会释放GIL并尝试重新获取它,这意味着时间表可能看起来像这样
MT - > T1 - > MT - > T2 - > MT - > MT - > T4 - > T3 ......
在python3.2中,一个线程释放GIL并指示其他线程接受它,因此它不会再次获取GIL,时间表将如下所示:
MT - > T1 - > MT - > T2 - > MT - > T3 - > MT - > T4 ......
同一时间内只有两个线程处于活动状态:)