python多線程和鎖

python中,有兩個標(biāo)準(zhǔn)模塊thread和threading可以實現(xiàn)多線程,不過threading更加高級,推薦使用threading。

threading 模塊提供的常用方法:

  • threading.currentThread(): 返回當(dāng)前的線程變量。

  • threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啟動后、結(jié)束前,不包括啟動前和終止后的線程。

  • threading.activeCount(): 返回正在運行的線程數(shù)量,與len(threading.enumerate())有相同的結(jié)果。

  • threading.setName 設(shè)置線程名

  • threading.getName 獲得線程名

  • threading.Timer() 定時器,,每隔一段時間就開一一個線程調(diào)用一個函數(shù)

  • threading.Thread(target=方法名, name='線程名', args=參數(shù))啟動一個線程,返回一個進程對象 。

這里以主線程A,子線程B為例:

  • start() 調(diào)用B.start()開始執(zhí)行子線程

  • join() 調(diào)用B。join開始執(zhí)行,同時主線程會在調(diào)用的地方等待

  • setDaemon() 主線程A中調(diào)用了B.setDaemon(),這個的意思是,把主線程A設(shè)置為守護線程, 要是主線程A執(zhí)行結(jié)束了,就不管子線程B是否完成,一并和主線程A退出(和join相反)。必須在start() 方法調(diào)用之前設(shè)置

threading 模塊提供的常量:

threading.TIMEOUT_MAX 設(shè)置threading全局超時時間。

線程鎖

多線程中,除了線程自己的臨時變量, 所有全局或靜態(tài)變量都由所有線程共享,所以,任何一個變量都可以被任何一個線程修改。
因此,需要引入線程鎖給變量上一把鎖,當(dāng)某個線程開始執(zhí)行時,我們說,該線程因為獲得了鎖,因此其他線程不能同時執(zhí)行,只能等待。

balance = 0
lock = threading.Lock()

def run_thread(n):
    for i in range(100000):
        # 先要獲取鎖:
        lock.acquire()
        try:
            # 放心地改吧:
            change_it(n)
        finally:
            # 改完了一定要釋放鎖:
            lock.release()

lock.acquire()時,只有一個線程能成功地獲取鎖,然后繼續(xù)執(zhí)行代碼,其他線程就繼續(xù)等待直到獲得鎖為止才能執(zhí)行l(wèi)ock.acquire()后的代碼。

獲得鎖的線程用完后一定要釋放鎖,否則那些苦苦等待鎖的線程將永遠等待下去,成為死線程。

python中, 線程對多核cpu無效

因為Python的線程雖然是真正的線程,但解釋器執(zhí)行代碼時,有一個GIL鎖:Global Interpreter Lock,任何Python線程執(zhí)行前,必須先獲得GIL鎖,然后,每執(zhí)行100條字節(jié)碼,解釋器就自動釋放GIL鎖,讓別的線程有機會執(zhí)行。這個GIL全局鎖實際上把所有線程的執(zhí)行代碼都給上了鎖,所以,多線程在Python中只能交替執(zhí)行,即使100個線程跑在100核CPU上,也只能用到1個核。

所以,在Python中,可以使用多線程,但不要指望能有效利用多核。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進程 之前我們已經(jīng)了解了操作系統(tǒng)中進程的概念,程序并不能單獨運行,只有...
    go以恒閱讀 1,787評論 0 6
  • 多進程 要讓python程序?qū)崿F(xiàn)多進程,我們先了解操作系統(tǒng)的相關(guān)知識。 Unix、Linux操作系統(tǒng)提供了一個fo...
    蓓蓓的萬能男友閱讀 670評論 0 1
  • 關(guān)于Python多線程的概述 由于GIL的存在,Python的多線程在CPU密集型任務(wù)并沒有多大的優(yōu)勢,任何Pyt...
    千鳥月讀閱讀 587評論 0 0
  • 線程和進程 計算機,用于計算的機器。計算機的核心是CPU,在現(xiàn)在多核心的電腦很常見了。為了充分利用cpu核心做計算...
    人世間閱讀 24,448評論 3 85
  • 作者|清君策 當(dāng)你真正明辨是非的時候,也正是你成長的時候。 小黑因為人類的破壞,而失去了生存的地方,不得不跑到人類...
    子清視界閱讀 1,180評論 0 7

友情鏈接更多精彩內(nèi)容