Python多線程編程,線程鎖

 

多線程

  • 什麼是線程?node

    1. 線程也是一種多任務的編程方法,能夠利用計算機多核資源完成程序的併發運行。
    2. 線程又被稱爲輕量級進程
  • 線程的特徵python

    1. 線程是計算機多核分配的最小單位
    2. 一個進程能夠包含多個線程
    3. 線程也是一個運行的過程,消耗計算機資源,多個線程共享進程的資源和空間
    4. 線程的建立刪除消耗的資源都遠遠比進程小
    5. 多個線程之間執行互不干擾
    6. 線程也有本身的特有屬性,好比指令集ID

threading 模塊建立線程

 

  • t=threading.Thread()git

    • 功能:建立線程對象github

    • 參數web

      • name:線程名稱,若是爲空則爲默認值,Tread-1,Tread-2,Tread-3
      • target:線程函數
      • args:元組,給線程函數按照位置傳參
      • kwargs:字典,給縣城函數按照鍵值傳參
  • 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程序併發

  • 解決方案

    • 儘可能使用進程完成併發(和沒說同樣)
    • 不適當用C解釋器 (用C# ,JAVA)
    • 儘可能使用多種方案組合的方式進行併發操做,線程用做高延遲IO
做者: Banl
----------------------------------------------------------------------

個性簽名:青春用來揮霍,白頭不知所措!

若是這篇文章對你有些幫助,記得在右下角點個「推薦」,拜謝!

相關文章
相關標籤/搜索