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