什麼是多工?
簡單地說,就是作業系統可以同時執行多個任務。
實現多工有多種方式,執行緒、程序、協程。
多工的概念:並行和併發
併發:指的是任務數多餘cpu核數,通過作業系統的各種任務排程演算法,
實現用多個任務「一起」執行
並行:指的是任務數小於等於cpu核數,即任務真的是一起執行的
注意:
假的多工--->併發(時間片輪轉--cpu高速輪流執行)
真的多工--->並行(cpu乙個乙個單獨執行)
什麼是執行緒?
可以簡單理解為同一程序中有多個計數器,每個執行緒的執行時間不確定,
而每個程序的時間片相等,執行緒是作業系統排程執行的最小單位.
執行緒的建立(兩種)
6.1thread(target=函式名)
6.2建立乙個類(繼承thread方法),裡邊必須有run方法,建立乙個例項物件,
呼叫start的時候,start會自動呼叫run方法(其他函式和方法,都在run方法裡邊完成)
執行緒的建立步驟import threading
# 建立乙個執行緒物件
t1 = threading.thread(target=func_name, args=(num,), name=」子執行緒名字」)
# 建立乙個執行緒並啟動
t1.start()
# 等待子執行緒執行完畢之後再繼續向下執行主線程
t1.join()
備註:主線程會等待子執行緒結束之後才會結束,主線程一死,子執行緒也會死。
執行緒的排程是隨機的,並沒有先後順序。
主線程和子執行緒了解函式的呼叫和指向:
target=函式()------>呼叫函式 ; target=函式--->指向函式
3.1呼叫start的時候,子執行緒被建立;函式執行完,子執行緒結束
3.2主線程執行完不會結束,會等待子執行緒結束後,再結束
3.3如果主線程先結束了,所有剩下的子執行緒會被強制結束
3.4注意:執行緒的是沒有先後順序的
列舉函式enumerate的用法定義:enumerate()是python的內建函式,在字典上是列舉、列舉的意思。
用途:用於將乙個可遍歷的資料物件(如列表、元組或字串)組合為乙個索引序列,
同時列出資料和資料下標,一般用在 for 迴圈當中,通過threading.enumerate()就可以獲取執行緒列表。
enumerate函式的應用(檢視執行緒的數量):
threading.enumerate()可以建立乙個執行緒列表,可以通過列表的長度檢視執行緒的數量
thread和start,哪個執行時候建立物件、執行執行緒:
1.呼叫thread,不會建立執行緒,只是建立乙個物件
2.當呼叫thread建立出來的例項物件的start方法的時候,才會建立執行緒以及讓這個執行緒開始執行
多執行緒-共享全域性變數優缺點:在乙個程序內的所有執行緒共享全域性變數,很方便在多個執行緒間共享資料
缺點就是,執行緒是對全域性變數隨意遂改可能造成多執行緒之間對全域性變數的混亂
導致的問題:
如果多個執行緒同時對乙個全域性變數操作,會出現資源競爭問題,從而資料結果會不正確
注意:
target指定將來這個執行緒去哪個函式執行**
args指定將來呼叫函式的時候,傳遞什麼資料過去-->元祖要加 「,」
只有在修改指向的時候,才會修改全域性變數
什麼是同步:
同步就是協同步調,按預定的先後次序進行執行
同步的作用:
解決執行緒同時修改全域性變數的方式
互斥鎖--解決資源競爭的問題互斥鎖是怎麼引入的?當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制,
執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖
互斥鎖的構建流程
某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為「鎖定」,其他執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成「非鎖定」,其他執行緒才能再次鎖定該資源。
互斥鎖的作用
互斥鎖保證了每次只有乙個執行緒進行寫入操作,保證了多執行緒情況下資料的正確性。
什麼是死鎖:
並且同時等待對方的資源,就會造成死鎖
如何避免死鎖:(兩種方法)
1.銀行家演算法
2.新增超時函式timeout()
python多工 執行緒
併發 指的是任務數多餘cpu核數,通過作業系統的各種任務排程演算法,實現用多個任務 一起 執行 實際上總有一些任務不在執行,因為切換任務的速度相當快,看上去一起執行而已 並行 指的是任務數小於等於cpu核數,即任務真的是一起執行的 執行緒python的thread模組是比較底層的模組,python的...
python 多工 執行緒(一)
python提供了兩個模組來實現多執行緒thread和threading 推薦 thread模組提供了基本的執行緒和鎖支援,threading提供的是更高階的完全的執行緒管理,且更方便操作。在 python3 中不能再使用 thread 模組。為了相容性,python3 將 thread 重新命名為...
Python 多工 執行緒同步
高階程式設計技巧 學習筆記 1.1 實現兩個執行緒一問一答 class xiaoai threading.thread def init self super init name 小艾同學 def run self print f 在 print f 你猜現在幾點了?class tianmao th...