併發:多個任務同一時間段進行
並行:多個任務同一時刻進行
執行緒模組
python通過兩個標準庫_thread 和threading,提供對執行緒的支援 , threading對_thread進行了封裝
因此在實際的使用中我們一般都是使用threading,threading模組中提供了thread , lock , rlock ,
condition等元件
thread類
常用引數
target 表示呼叫物件,即子執行緒要執行的任務
name 子執行緒的名稱
args 傳入target函式中的位置引數,是乙個元組,引數後必須加逗號隔開
常用例項方法
thread.run (self) 執行緒啟動時執行的方法,由該方法呼叫target引數所指定的函式
thread.start (self) 啟動程序,start方法就是去幫你呼叫run方法
thread.terminate (self) 強制終止執行緒
thread.join (self, timeout=none) 阻塞呼叫,主線程進行等待
thread.setdaemon (self,daemonic) 將子執行緒設定為守護執行緒
thread.getname(self,name) 獲取執行緒名稱
thread.setname (self,name ) 設定執行緒名稱
建立執行緒
例項thread類
繼承thread類
主線程 : 當乙個程式啟動時 , 就有乙個執行緒開始執行 , 該執行緒通常叫做程式的主線程
子執行緒 : 因為程式是開始時就執行的 , 如果你需要再建立執行緒 , 那麼建立的執行緒就是這個主線程的子執行緒
主線程的重要性體現在兩方面 :
是產生其他子執行緒的執行緒
通常它必須最後完成執行比如執行各種關閉操作
join : 阻塞呼叫程式 , 直到呼叫join () 方法的執行緒執行結束, 才會繼續往下執行
setdaemon() 與 join() 基本上是相對的 , join會等子執行緒執行完畢 ; 而setdaemon則不會等,主線程結束,則全部結束
執行緒通訊
鎖在多執行緒中 , 所有變數對於所有執行緒都是共享的
因此 , 執行緒之間共享資料最大的危險在於多個執行緒同時修改乙個變數 , 那就亂套了
所以我們需要互斥鎖 , 來鎖住資料
執行緒間全域性變數的共享
因為執行緒屬於同乙個程序,因此它們之間共享記憶體區域,所以全域性變數是公共的
共享記憶體間存在競爭問題
在這裡進行原子操作(取值、運算、賦值)的時候切換到了其它執行緒,乙個執行緒還沒賦值,另外的執行緒就已經給它賦值了,然後又切回來繼續賦值
使用鎖來控制共享資源的訪問
加鎖:lock物件.acquire()
解鎖:lock物件.release()
佇列的基本概念
乙個入口,乙個出口,先入先出(fifo)
執行緒安全佇列、操作一覽
入隊: put(item)
出隊: get()
測試空: empty()
測試滿: full()
佇列長度: qsize()
任務結束: task_done()
等待完成: join()
執行緒池池的概念
主線程:相當於生產者,只管向執行緒池提交任務,並不關心執行緒池是如何執行任務的,因此,也不關心是哪乙個執行緒執行的這個任務
執行緒池:相當於消費者,負責接收任務,並將任務分配到乙個空閒的執行緒中去執行
執行緒池的簡單實現
python內建執行緒池
池的其他操作
操作一: close - 關閉提交通道,不允許再提交任務
操作二: terminate - 中止程序池,中止所有任務
python多執行緒實現
資料夾命名不能用官方已有的模組名比如threading.py test.py等等都會報錯 from multiprocessing import process import os 子程序要執行的 def run proc name print run child process s s name,...
python多執行緒實現
coding utf 8 import threading 匯入執行緒模組 from time import ctime,sleep 建立執行緒事件 defeat print 我在吃東西 s ctime 執行緒組 threads 建立執行緒數量 for x in range 10 t1 thread...
python多執行緒執行緒池實現
在python中多執行緒可以使用threading來實現,但實際使用時考慮效能等,大多會使用到執行緒池,下面就是基於python2和python3來說明下執行緒池的使用。import time def testthread fl time.sleep 1 print print fl return ...