Why/How python3 按创建顺序安排线程?
Why/How python3 schedules threads in creation order?
以下代码在 python27 上打印 False
并在 python36[=26 上打印 True
=] 在我的 Mac 上。
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 中以更好地 scheduling/fairness。我对 how/why 感到困惑,此代码在 python36.
上打印 True
在 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 ...
只有两个线程会同时处于活动状态:)
以下代码在 python27 上打印 False
并在 python36[=26 上打印 True
=] 在我的 Mac 上。
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 中以更好地 scheduling/fairness。我对 how/why 感到困惑,此代码在 python36.
上打印True
在 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 ...
只有两个线程会同时处于活动状态:)