Python中線程的使用

2022-08-02 18:39:11 字數 2699 閱讀 8173

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

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

執行緒的實現

執行緒模組

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類

主線程 : 當乙個程式啟動時 , 就有乙個執行緒開始執行 , 該執行緒通常叫做程式的主線程

子執行緒 : 因為程式是開始時就執行的 , 如果你需要再建立執行緒 , 那麼建立的執行緒就是這個主線程的子執行緒

主線程的重要性體現在兩方面 : 

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

python 中線程池的使用

python中已經有了threading模組,為什麼還需要執行緒池呢,執行緒池又是什麼東西呢?在介紹執行緒同步的訊號量機制的時候,舉得例子是爬蟲的例子,需要控制同時爬取的執行緒數,例子中建立了20個執行緒,而同時只允許3個執行緒在執行,但是20個執行緒都需要建立和銷毀,執行緒的建立是需要消耗系統資源...

python中線程

程序和執行緒的區別 1.程序 每個程式都會有乙個程序,負責管理程式各個功能的執行,程序只會有乙個 而且至少有乙個 相當於包工頭 2.執行緒 每個程序裡面至少有乙個執行緒,稱之為主線程,除此以外還會有其他執行緒,稱之為分執行緒 執行緒是控制任務執行的最小單位 相當於農名工 3.程序負責控制各個執行緒的...

python 中線程

import threading import time class test threading.thread 繼承threading.thread def init self super test,self init def run self 設定執行緒方法 threadname threadi...