併發:多個任務同一時間段進行python
並行:多個任務同一時刻進行安全
線程的實現多線程
線程模塊併發
Python經過兩個標準庫_thread 和threading,提供對線程的支持 , threading對_thread進行了封裝函數
所以在實際的使用中咱們通常都是使用threading測試
threading模塊中提供了Thread , Lock , RLock , Condition等組件ui
Thread類spa
經常使用參數線程
target 表示調用對象,即子線程要執行的任務3d
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 & setDaemon
主線程 : 當一個程序啓動時 , 就有一個線程開始運行 , 該線程一般叫作程序的主線程
子線程 : 由於程序是開始時就執行的 , 若是你須要再建立線程 , 那麼建立的線程就是這個主線程的子線程
主線程的重要性體如今兩方面 :
1. 是產生其餘子線程的線程
2. 一般它必須最後完成執行好比執行各類關閉操做
join : 阻塞調用程序 , 直到調用join () 方法的線程執行結束, 纔會繼續往下執行
setDaemon() 與 join() 基本上是相對的 , join會等子線程執行完畢 ; 而setDaemon則不會等,主線程結束,則所有結束
線程通訊
鎖
在多線程中 , 全部變量對於全部線程都是共享的
所以 , 線程之間共享數據最大的危險在於多個線程同時修改一個變量 , 那就亂套了
因此咱們須要互斥鎖 , 來鎖住數據
線程間全局變量的共享
由於線程屬於同一個進程,所以它們之間共享內存區域,因此全局變量是公共的
共享內存間存在競爭問題
在這裏進行原子操做(取值、運算、賦值)的時候切換到了其它線程,一個線程還沒賦值,另外的線程就已經給它賦值了,而後又切回來繼續賦值
使用鎖來控制共享資源的訪問
加鎖:Lock對象.acquire()
解鎖:Lock對象.release()
隊列的基本概念
一個入口,一個出口,先入先出(FIFO)
線程安全隊列、操做一覽
入隊: put(item)
出隊: get()
測試空: empty()
測試滿: full()
隊列長度: qsize()
任務結束: task_done()
等待完成: join()
線程池
池的概念
主線程:至關於生產者,只管向線程池提交任務,並不關心線程池是如何執行任務的,所以,也不關心是哪個線程執行的這個任務
線程池:至關於消費者,負責接收任務,並將任務分配到一個空閒的線程中去執行
線程池的簡單實現
python內置線程池
池的其餘操做
操做一: close - 關閉提交通道,不容許再提交任務
操做二: terminate - 停止進程池,停止全部任務