下面的代码在python27上打印False
,在my Mac上在python36上打印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)))
我知道,为了更好地调度/公平,GIL改进是在python3中添加的。我不明白这些代码是如何/为什么在python36上打印python36的。
发布于 2018-01-04 01:52:28
在Python3.2中,GIL处理发生了更改(请阅读更多这里)
主要影响上述代码的更改是在发布后如何重新获得GIL。
在更改之前,python将发布GIL,所有线程都将为此而战,这意味着在主线程创建线程之后,它将释放GIL并尝试重新获取它,这意味着日程可能如下所示
-> T1 -> MT ->T2 -> MT -> MT ->T4 -> T3
在python3.2中,一个线程释放GIL并指示其他线程接受它,因此不会再次使用GIL,日程如下所示:
-> T1 -> MT ->T2 -> MT -> T3 -> MT -> T4 .
在同一时间只有两个线程处于活动状态:)
https://stackoverflow.com/questions/48047820
复制相似问题