這篇文章帶給大家的內容是關於Python多線程以及線程鎖簡單理解(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
多執行緒threading 模組建立執行緒建立自己的執行緒類別執行緒通訊執行緒同步互斥方法執行緒鎖@需要了解! ! !
多執行緒
什麼是執行緒?
執行緒也是一種多任務的程式設計方法,可以利用電腦多核心資源完成程式的並發運行。
執行緒又被稱為輕量級進程
執行緒的特徵
執行緒是電腦多核心分配的最小單位
一個行程可以包含多個執行緒
執行緒也是一個運作的過程,消耗電腦資源,多個執行緒共享行程的資源和空間
#執行緒的建立刪除消耗的資源都遠遠比行程小
#多個執行緒之間執行互不干擾
執行緒也有自己的特有屬性,例如指令集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 = Truet.setDaemon(Ture)設定方法#!/usr/bin/env python3 from threading import Thread from time import sleep import os # 创建线程函数 def music(): sleep(2) print("分支线程") t = Thread(target = music) # t.start() # ****************************** print("主线程结束---------") '''没有设置的打印结果 主线程结束--------- 分支线程 ''' '''设置为True打印结果 主线程结束--------- '''threading .currentThread:取得目前執行緒物件@此處程式碼示意子執行緒共用相同行程內的變數 #!/usr/bin/env python3
from threading import Thread import time class MyThread(Thread): name1 = 'MyThread-1' def __init__(self,target,args=(), kwargs={}, name = 'MyThread-1'): super().__init__() self.name = name self.target = target self.args = args self.kwargs = kwargs def run(self): self.target(*self.args,**self.kwargs) def player(song,sec): for i in range(2): print("播放 %s:%s"%(song,time.ctime())) time.sleep(sec) t =MyThread(target = player, args = ('亮亮',2)) t.start() t.join()線程通信通信方法:由於多個線程共享進程的內存空間,所以執行緒間通訊可以使用全域變數完成
執行緒同步互斥方法
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.release():解鎖
##也可以用過with來上鎖1 with lock: 2 ... 3 ...
要了解! ! !
Python線程的GIL問題(全域解釋器):
後果:一個解釋器同一時刻只能解釋執行一個線程,所以導致Python線程效率低下,但是當遇到IO阻塞時線程會主動讓出解釋器,因此Pyhton線程更加適合高延遲的IO程序並發解決方案盡量使用進程完成並發(和沒說一樣)不適當地用C解釋器(用C# ,JAVA)盡量使用多種方案組合的方式進行並發操作,執行緒用作高延遲IO以上是Python多執行緒以及線程鎖簡單理解(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!