1. 程式人生 > >threading模塊,python下的多線程

threading模塊,python下的多線程

read lob -s prev sts other sleep native int

一、GIL全局解釋器鎖

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

無論你啟動多少個線程,Python解釋器在同一時刻,都只允許一個線程在cpu上執行,Python啟動一個線程是調用C語言的接口,讓操作系統啟動線程,所以所有的線程調度是操作系統在執行,而Python解釋器在啟動線程後只能等待操作系統返回結果。所以Python解釋器為了防止同一時刻多個線程操作同一個數據,造成數據混亂,所以在cpython解釋器中,加入了global interpreter lock。

註意:Jpython、pypy等解釋器都沒有GIL

二、Python中的多線程
  • python 中的多線程雖然不能並行,但是能達到高並發的效果。並不是一無用處
2.1 threading模塊
import threading
import time
 
def run(i): #定義每個線程要運行的函數
 
    print("線程::%s  正在運行" %i)
 
    time.sleep(1)
 
if __name__ == '__main__':
 
    t1 = threading.Thread(target= run, args=(1,)) #生成一個線程實例     參數還有name 線程名,daemon 是否守護線程 True
    t2 = threading.Thread(target= run, args=(2, )) #生成另一個線程實例
 
    t1.start() #啟動線程
    t2.start() #啟動另一個線程
 
    print(t1.getName()) #獲取線程名
    print(t2.getName())
2.2 Join及守護線程

當你在啟動一個線程之後,前面說過由於是調用系統創建,所以主進程就和創建的線程沒有關系了,

threading模塊,python下的多線程