Python多執行緒程式設計,執行緒鎖
-
什麼是執行緒?
- 執行緒也是一種多工的程式設計方法,可以利用計算機多核資源完成程式的併發執行。
- 執行緒又被稱為輕量級程序
-
執行緒的特徵
- 執行緒是計算機多核分配的最小單位
- 一個程序可以包含多個執行緒
- 執行緒也是一個執行的過程,消耗計算機資源,多個執行緒共享程序的資源和空間
- 執行緒的建立刪除消耗的資源都遠遠比程序小
- 多個執行緒之間執行互不干擾
- 執行緒也有自己的特有屬性 ,比如指令集ID
threading 模組建立執行緒
-
t=threading.Thread()
-
功能:建立執行緒物件
-
引數
- name:執行緒名稱,如果為空則為預設值,Tread-1,Tread-2,Tread-3
- target:執行緒函式
- args:元組,給執行緒函式按照位置傳參
- kwargs:字典,給縣城函式按照鍵值傳參
-
-
t.start()
:啟動執行緒,自動執行執行緒函式 -
t.join([timeout])
:回收程序 -
t.is_alive()
:檢視執行緒狀態 -
t.name()
:檢視執行緒名稱 -
t.setName()
:設定執行緒名稱 -
t.daemon屬性
:預設主線成退出不影響分支執行緒繼續執行,如果設定為True則分支執行緒隨著主執行緒一起退出-
設定方法
-
t.daemon = True
-
t.setDaemon(Ture)
-
-
-
1 #!/usr/bin/env python3 2 from threading import Thread 3 from time import sleep 4 import os 5 6 # 建立執行緒函式 7 def music(): 8sleep(2) 9print("分支執行緒") 10 11 t = Thread(target = music) 12 # t.start()# ****************************** 13 print("主執行緒結束---------") 14 15 '''沒有設定的列印結果 16 主執行緒結束--------- 17 分支執行緒 18 ''' 19 20 '''設定為True列印結果 21 主執行緒結束--------- 22 '''
-
threading.currentThread
:獲取當前執行緒物件
@此處程式碼示意子執行緒共享同一個程序內的變數
1#!/usr/bin/env python3 2from threading import Thread 3from time import sleep 4import os 5 6# 建立執行緒函式 7def music(): 8global a 9print("a=",a) 10a = 10000 11for i in range(5): 12sleep(1) 13print("1212") 14 15a = 1 16t = Thread(target = music) 17t.start() 18t.join() 19print("主執行緒的a =",a)
建立自己的執行緒類
考察點:類的使用,呼叫父類的__init__
方法,函式*傳參和**傳參
1 2 3 from threading import Thread 4 import time 5 6 class MyThread(Thread): 7name1 = 'MyThread-1' 8def __init__(self,target,args=(), kwargs={}, name = 'MyThread-1'): 9super().__init__() 10self.name = name 11self.target = target 12self.args = args 13self.kwargs = kwargs 14def run(self): 15self.target(*self.args,**self.kwargs) 16 17 def player(song,sec): 18for i in range(2): 19print("播放 %s:%s"%(song,time.ctime())) 20time.sleep(sec) 21 22 t =MyThread(target = player, args = ('亮亮',2)) 23 24 t.start() 25 t.join() 26
執行緒通訊
通訊方法:由於多個執行緒共享程序的記憶體空間,所以執行緒間通訊可以使用全域性變數完成
注意事項:執行緒間使用全域性變數往往要同步互斥機制保證通訊的安全
執行緒同步互斥方法
-
event
-
e = threading.Event()
:建立事件物件 -
e.wait([timeout])
:設定狀態,如果已經設定,那麼這個函式將阻塞,timeout為超時時間 -
e.set
:將e變成設定狀態 -
e.clear
:刪除設定狀態
import threading from time import sleep def fun1(): print("bar拜山頭") global s s = "天王蓋地虎" def fun2(): sleep(4) global s print("我把限制解除了") e.set()# 解除限制,釋放資源 def fun3(): e.wait() # 檢測限制 print("說出口令") global s if s == "天王蓋地虎": print("寶塔鎮河妖,自己人") else: print("打死他") s = "哈哈哈哈哈哈" # 建立同步互斥物件 e = threading.Event() # 建立新執行緒 f1 = threading.Thread(target = fun1) f3 = threading.Thread(target = fun3) f2 = threading.Thread(target = fun2) # 開啟執行緒 f1.start() f3.start() f2.start() #準備回收 f1.join() f3.join() f2.join()
-
lock = threading.Lock()
:建立鎖物件 -
lock.acquire()
:上鎖 -
lock.release()
:解鎖
也可以用過with
來上鎖
1 with lock: 2... 3...
@需要了解!!!
-
Python執行緒的GIL問題(全域性直譯器):
python---->支援多執行緒---->同步互斥問題---->加鎖解決---->超級鎖(給直譯器加鎖)---->直譯器同一時刻只能解釋一個執行緒--->導致效率低下
-
後果:
一個直譯器同一時刻只能解釋執行一個執行緒,所以導致Python執行緒效率低下,但是當遇到IO阻塞時執行緒會主動讓出直譯器,因此Pyhton執行緒更加適合高延遲的IO程式併發
-
解決方案
- 儘量使用程序完成併發(和沒說一樣)
- 不適當用C直譯器 (用C# ,JAVA)
- 儘量使用多種方案組合的方式進行併發操作,執行緒用作高延遲IO
作者:Banlofollow,noindex" target="_blank">
出處:https://www.cnblogs.com/BanL/
----------------------------------------------------------------------
個性簽名:青春用來揮霍,白頭不知所措!
如果這篇文章對你有些幫助,記得在右下角點個“推薦” ,拜謝!