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

问题描述 投票:3回答:1

以下代码在我的Mac上的python36上打印python27上的FalseTrue

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

python-3.x python-multithreading gil
1个回答
1
投票

在Python3.2中,GIL处理已更改(阅读更多here

主要影响上述代码的更改是在发布后重新获取GIL的方式。

在更改之前python会释放GIL并且所有线程都会为它而战,这意味着在主线程创建线程之后它释放GIL并尝试重新获取它,这意味着时间表可能看起来像这样

M - > T1 - > Mt - > Tt - > Mt - > Mt - > T4 - > Mt.

在python3.2中,一个线程释放GIL并指示其他线程接受它,因此它不会再次获取GIL,时间表将如下所示:

米 - > T1 - >米 - >米 - >米 - >米 - >米 - >破伤风......

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

© www.soinside.com 2019 - 2024. All rights reserved.