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 ...

只有两个线程会同时处于活动状态:)