什麼是線程?node
線程的特徵python
t=threading.Thread()
git
功能:建立線程對象github
參數web
t.start()
:啓動線程,自動運行線程函數編程
t.join([timeout])
:回收進程windows
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(): 8 sleep(2) 9 print("分支線程") 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 2 from threading import Thread 3 from time import sleep 4 import os 5 6 # 建立線程函數 7 def music(): 8 global a 9 print("a=",a) 10 a = 10000 11 for i in range(5): 12 sleep(1) 13 print("1212") 14 15 a = 1 16 t = Thread(target = music) 17 t.start() 18 t.join() 19 print("主線程的a =",a)
考察點:類的使用,調用父類的__init__
方法,函數*傳參和**傳參
1 2 3 from threading import Thread 4 import time 5 6 class MyThread(Thread): 7 name1 = 'MyThread-1' 8 def __init__(self,target,args=(), kwargs={}, name = 'MyThread-1'): 9 super().__init__() 10 self.name = name 11 self.target = target 12 self.args = args 13 self.kwargs = kwargs 14 def run(self): 15 self.target(*self.args,**self.kwargs) 16 17 def player(song,sec): 18 for i in range(2): 19 print("播放 %s:%s"%(song,time.ctime())) 20 time.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程序併發
解決方案
個性簽名:青春用來揮霍,白頭不知所措!
若是這篇文章對你有些幫助,記得在右下角點個「推薦」,拜謝!