python 執行緒池 鎖 python多執行緒和鎖

2021-10-25 19:22:04 字數 1592 閱讀 6943

python中,有兩個標準模組thread和threading可以實現多執行緒,不過threading更加高階,推薦使用threading。

threading 模組提供的常用方法:

threading.currentthread(): 返回當前的執行緒變數。

threading.enumerate(): 返回乙個包含正在執行的執行緒的list。正在執行指執行緒啟動後、結束前,不包括啟動前和終止後的執行緒。

threading.activecount(): 返回正在執行的執行緒數量,與len(threading.enumerate())有相同的結果。

threading.setname 設定執行緒名

threading.getname 獲得執行緒名

threading.timer() 定時器,,每隔一段時間就開一乙個執行緒呼叫乙個函式

threading.thread(target=方法名, name='執行緒名', args=引數)啟動乙個執行緒,返回乙個程序物件 。

這裡以主線程a,子執行緒b為例:

start() 呼叫b.start()開始執行子執行緒

join() 呼叫b。join開始執行,同時主線程會在呼叫的地方等待

setdaemon() 主線程a中呼叫了b.setdaemon(),這個的意思是,把主線程a設定為守護執行緒, 要是主線程a執行結束了,就不管子執行緒b是否完成,一併和主線程a退出(和join相反)。必須在start() 方法呼叫之前設定

threading 模組提供的常量:

threading.timeout_max 設定threading全域性超時時間。

執行緒鎖多執行緒中,除了執行緒自己的臨時變數, 所有全域性或靜態變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改。

因此,需要引入執行緒鎖給變數上一把鎖,當某個執行緒開始執行時,我們說,該執行緒因為獲得了鎖,因此其他執行緒不能同時執行,只能等待。

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()時,只有乙個執行緒能成功地獲取鎖,然後繼續執行**,其他執行緒就繼續等待直到獲得鎖為止才能執行lock.acquire()後的**。

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

python中, 執行緒對多核cpu無效

因為python的執行緒雖然是真正的執行緒,但直譯器執行**時,有乙個gil鎖:global interpreter lock,任何python執行緒執行前,必須先獲得gil鎖,然後,每執行100條位元組碼,直譯器就自動釋放gil鎖,讓別的執行緒有機會執行。這個gil全域性鎖實際上把所有執行緒的執行**都給上了鎖,所以,多執行緒在python中只能交替執行,即使100個執行緒跑在100核cpu上,也只能用到1個核。

所以,在python中,可以使用多執行緒,但不要指望能有效利用多核。

python 執行緒池 Python的執行緒池

usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...

python 執行緒池 python執行緒池原始碼解析

本篇主要講下threadpoolexecutor的實現。由於業務量不大,且一直使用框架進行程式設計,對執行緒的理解一直很模糊,基本處於不想阻塞程式執行,起乙個執行緒啟動任務的階段。總感覺自己好像會執行緒一樣,實則一直處於一種懵懂狀態,通過一段時間檢視一些別人寫的原始碼,終於有所悟,也記錄下自己的學習...

python執行緒池

import time threadpool為執行緒池模組 import threadpool deftest str print str time.sleep 2 if name main starttime time.time 建立執行緒池,最多建立的執行緒數為10 pool threadpoo...