Python高階 多執行緒 05 執行緒

2021-08-27 09:01:29 字數 1917 閱讀 1071

併發:時間段內多個程式輪流執行

並行:同乙個時刻不同cpu同時執行

執行緒:程式執行中,執行**的乙個分支。每個執行至少都有乙個執行緒.

執行緒是作業系統排程資源的基礎單位

1.建立

import threading 

方法:thread    

group: 執行緒組,目前只能使用none

target: 執行的目標任務名,無需()

args 是乙個元祖《位置引數》

kwargs 是乙個字典《關鍵字引數》

name: 執行緒名,一般不用設定

2.啟動執行緒執行

執行緒名.start()進行執行

獲取當前程式中的執行緒列表

threading.enumrate()

多執行緒執行的順序是無序的

主線程在所有子執行緒結束後才結束

daemon執行緒/守護執行緒

所有的daemon執行緒會隨著最後乙個 非demon的退出 而全部退出

setdaemo(true) 將子執行緒設定為守護執行緒,跟隨主線程一起退出

用於:多執行緒 + 提前退出 的時候,子執行緒沒有執行完成,程式無法退出

檢視執行緒的標識:print(threading.current_thread())

檢視當前程式所有存活的執行緒列表

如果列表中1個,就是只剩主線程

判斷執行緒是否還存活

執行緒物件.is_alive()

阻塞等待子執行緒執行完成

執行緒物件.join()

建立執行緒方法:1.使用threading  2.自定義執行緒,繼承threading

方法2過程:

1.繼承threading.thread類及其子類

2.重寫其中run方法 子執行緒會從run開始執行 run中儲存的是子執行緒執行的**

建立子執行緒 建立子類的物件  物件.start()

4.如果子執行緒需要更多的引數 重寫init方法,並且在其中呼叫super(父類)

5.strat() != run()  strat的作用:建立執行子執行緒,在子執行緒中呼叫run()

主要目的是將執行緒和執行緒會執行的**封裝在乙個類中

多執行緒共享全域性變數,用global進行注釋

執行緒是程式內部的一條執行線索《執行緒》

可能造成的問題: 資源競爭/資料競爭

原因:多個執行緒同時修改乙個共享的全域性資源,造成資料丟失

解決辦法:多執行緒同步-保持秩序 join和互斥鎖

互斥鎖:對共享的資料鎖定,保證同一時刻只能有乙個執行緒操作

目的:保證多執行緒共享資料不出現資源競爭和資料錯誤

格式:#建立    能保證同一時間點只有乙個執行緒能夠占有鎖

mutex = threading.lock()

#申**鎖    如果沒鎖定可以占有,如果已經被鎖定阻塞等待

mutex.acquire()        //鎖進入locked狀態

#解鎖    用完一定解鎖

mutex.release()        //鎖進入unlocked狀態

好處:確保執行緒從頭到尾執行

壞處:由多執行緒變化成單執行緒模式執行,鎖用不好容易死鎖

死鎖概念:一直等對方釋放鎖的情景就是死鎖

原因:1.資源的釋放方式不對

2.多工多資源申請,出現互相等待

影響:造成程式無法執行,一直被阻塞

關於執行緒順序,正常是主線程和子執行緒是同步執行,互不相關。

進行輸出,檢視執行緒結束的順序

守護執行緒設定後,主線程結束,子執行緒也會結束

設定守護後,看結束效果

通過join可以阻塞等待子執行緒執行完畢

設定join,看效果

在子執行緒開啟後輸出乙個話結束主線程,看以上三種方式的結果

python高階 多執行緒

1.1 獲取執行緒數 import threading import time def fun time.sleep 1 print hello t threading.thread target fun t.start print threading.enumerate while true le...

Python高階(多執行緒)

多執行緒結構 import threading def worker 子執行緒要執行的具體邏輯 函式 print threading t1 threading.current thread time.sleep 9 通過休眠模擬子執行緒非同步邏輯 print t1.getname new t thr...

多執行緒05 執行緒同步

1 執行緒同步 2 執行緒不安全案例 public class testthreadsynchronized class ticketwindow implements runnable private void buy try catch interruptedexception e system...