为什么/如何python3按创建顺序调度线程?

时间:2018-01-01 07:12:28

标签: python-3.x python-multithreading gil

以下代码在 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的方式/原因感到困惑。

1 个答案:

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

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