1. 程式人生 > >python中多執行緒簡介

python中多執行緒簡介

1.多執行緒的使用

(1)把一個函式按子執行緒的方式執行

from threading import Thread

t = Thread(target=func, args=(x,))  # 建立執行緒   target=函式名   args=函式的引數(放入的是實參)

t.setDaemon(True)  # 主執行緒守護   只要主執行緒的任務執行完 程式就結束

# 檢視當前任務是由哪個執行緒執行的
threading.current_thread()
# 檢視執行的程式有的執行的執行緒列表
threading.enumerate()
# 檢視執行的程式有多少個執行緒在執行
len(threading.enumerate())
threading.active_count()
t.join()   # 執行緒同步(一個執行緒執行任務完成 下個執行緒再執行任務)

t.start()   # 啟動執行緒執行任務

(2)自定義執行緒類

class MyThread(threading.Thread):

    def __init__(self, name):
        # 如果自定義執行緒中重寫init方法 子類需要呼叫父類同名方法
        super(MyThread, self).__init__()
        # 屬性
        self.name = name

    def work1(self):

        print(threading.current_thread())
        print(self.name, "工作1")

    def work2(self):
        print(threading.current_thread())
        print(self.name, "工作2")

    # 如果自定義執行緒 使用執行緒執行多工
    # 必須實現一個方法名叫做run的方法
    def run(self):
        print(threading.current_thread())
        self.work1()
        self.work2()

if __name__ == '__main__':
    # 建立一個子執行緒 (自定義執行緒類)
    my_thread = MyThread("自定義執行緒")
    # 啟動執行緒
    my_thread.start()

2.多執行緒共享全域性變數問題

  • 在一個程序內的所有執行緒共享全域性變數,很方便在多個執行緒間共享資料
  • 執行緒是對全域性變數隨意遂改可能造成多執行緒之間對全域性變數的混亂(即執行緒非安全)
  • 如果多個執行緒同時對同一個全域性變數操作,會出現資源競爭問題,從而資料結果會不正確

3.互斥鎖

threading模組中定義了Lock類,可以方便的處理鎖定:

# 建立鎖
mutex = threading.Lock()

# 鎖定
mutex.acquire()

# 釋放
mutex.release()

注意:

  • 如果這個鎖之前是沒有上鎖的,那麼acquire不會堵塞
  • 如果在呼叫acquire對這個鎖上鎖之前 它已經被 其他執行緒上了鎖,那麼此時acquire會堵塞,直到這個鎖被解鎖為止

鎖的好處:

  • 確保了某段關鍵程式碼只能由一個執行緒從頭到尾完整地執行

鎖的壞處:

  • 阻止了多執行緒併發執行,包含鎖的某段程式碼實際上只能以單執行緒模式執行,效率就大大地下降了
  • 由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖