python經過GIL來互斥不一樣線程對解釋器的使用,也就是說同一時間只有一個線程訪問python提供的API,在多核cpu中能夠實現多線程的獨立運行,可是因爲GIL,使多核退化成單核。
python的線程和操做系統的線程調度機制同樣,要解決兩個問題:python
在python中這兩個問題實在兩個不一樣的層次上解決的;對於什麼時候掛起線程,是由python自身決定的,考慮一下操做系統是如何進行進程調度的,當進程執行一段時間以後,發生時鐘中斷,操做系統響應時鐘中斷,並在這是進行進程度調度。一樣python中也是經過軟件模擬了這種始終中斷,來激活線程調度。多線程
<!-- lang: python --> >>> import sys >>>sys.getcheckinterval() 100
python是一條一條順序執行的,python內部維護着一個數值,這個數值是python的內部時鐘,默認值是100,也就是說python在執行完100條語句以後,開始進行線程調度。也使用這個數值檢查是否有異步事件發生。須要處理。
python控制着何時進行線程調度,當一個線程得到訪問python解釋器的所必需的GIL並進入解釋器後,當這個線程執行了100條語句後,python解釋器將強制掛起當前線程,開始切換到下一個處於等待的線程。
對於第二個問題,究竟哪一個線程會被執行,在這個問題上python是不會插手的,而是交給底層的操做系統來解決,python借用底層的操做系統的線程調度機制來決定下一個進入python解釋器的線程到底是誰。因此python的線程實際就是操做系統所支持的原生線程,python的多線程機制創建在操做系統的原生線程機制之上,不一樣的操做系統有不一樣的實現。 然而最終,在不一樣的操做系統的原聲線程之上,python提供了一套統一的抽象機制,給python的使用者一個多線程的工具箱,就是python的Thread和Threading。異步
在python虛擬機啓動時,多線程機制並無激活,他只支持單線程,一旦用戶調用 thread.start_new_thread,明確指示要建立多線程了,python會自動創建多線程機制和GIL。工具