代码之家  ›  专栏  ›  技术社区  ›  Yoav Glazner

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

  •  3
  • Yoav Glazner  · 技术社区  · 7 年前

    打印以下代码 False 在…上 蟒蛇27 True 在…上 蟒蛇36 在我的 雨衣 .

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

    我知道 吉尔 在中添加了改进 蟒蛇3 为了更好的时间安排/公平性。我对这些代码如何/为什么打印感到困惑 真的 在…上 蟒蛇36 .

    1 回复  |  直到 7 年前
        1
  •  1
  •   Yoav Glazner    7 年前

    在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。。。

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