Python中線程的使用


並發:多個任務同一時間段進行

並行:多個任務同一時刻進行

 

線程的實現

線程模塊

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 & 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 - 中止進程池,中止所有任務 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM