首頁  >  文章  >  後端開發  >  Python多執行緒以及線程鎖簡單理解(程式碼)

Python多執行緒以及線程鎖簡單理解(程式碼)

不言
不言原創
2018-09-14 17:16:261869瀏覽

這篇文章帶給大家的內容是關於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 = True

t.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
  from time import sleep
  import os
 
  # 建立執行緒函數
  def music():
      global a
  10000
      for i in range(5):
          sleep(1)
          print("1212")# #  t.start()
  t.join()
  print("主執行緒的a =",a)建立自己的執行緒類別

檢視點:類別的使用,呼叫父類的__init__方法,函數*傳參和**傳參



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.acquire():上鎖

lock.release():解鎖

##也可以用過with來上鎖

 

1 with lock:
2     ...
3     ...

要了解! ! !

Python線程的GIL問題(全域解釋器):

python---->支援多執行緒---->同步互斥問題---->加鎖定解決---->超級鎖定(給解釋器加鎖)---->解釋器同一時刻只能解釋一個線程--->導致效率低下

後果:

一個解釋器同一時刻只能解釋執行一個線程,所以導致Python線程效率低下,但是當遇到IO阻塞時線程會主動讓出解釋器,因此Pyhton線程更加適合高延遲的IO程序並發

解決方案

盡量使用進程完成並發(和沒說一樣)

不適當地用C解釋器(用C# ,JAVA)

盡量使用多種方案組合的方式進行並發操作,執行緒用作高延遲IO

以上是Python多執行緒以及線程鎖簡單理解(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn