python--多工執行緒

☞☜123♝發表於2019-01-02

print方法的注意點

def print(value, ..., end,..., flush)
複製程式碼
  • end 結尾符號,預設"\n"
  • flush 是否重新整理緩衝區資料到控制檯,python的print,預設是將資料寫入緩衝區,緩衝區有預設大小,只有資料大小超出緩衝區限制或者遇到換行符或者手動設定重新整理(flush=True)才會寫入到控制檯
import time
def main():
    for i in range(10):
        print("*",end="")
        time.sleep(1)

if __name__ == '__main__':
    main()
複製程式碼

併發和並行

  • 併發: 假的的多工,看上去同時執行,實際同一時刻只有一個任務在執行,cpu核心數小於任務數量
  • 並行:真的多工,cpu核心數大於等於任務數量

多執行緒的基本實現

為了實現多工,可以將任務放入子執行緒去執行

  1. 任務放在一個函式中
    def func():
        pass
複製程式碼
  1. 建立一個執行緒類的例項物件 t1 = threading.Thread(target=fun)
  2. 建立執行緒,並執行任務函式 t1.start()

主執行緒會等待所有子執行緒任務結束後再結束

多執行緒的第二種實現

寫一個類繼承自threading.Thread類,並重寫run()方法

class MyThread(threading.Thread):
    def run(self):
        """
        執行緒的執行體
        :return:
        """
        self.register()
        for i in range(3):
            time.sleep(1)
            msg = "I'm" + self.name + "@" + str(i)
            print(msg)
        self.login()

    def login(self):
        print("----login---")

    def register(self):
        print("---register----")
複製程式碼

如果需要在子執行緒執行任務,比如按照如下

t = MyThread()
t.start() # 不能呼叫run,否在就是在主執行緒執行run方法
複製程式碼

在傳統的建立執行緒的方式中,也是如上程式碼一樣,通過t.start()開啟子執行緒,並在子執行緒內呼叫run方法,

t1 = threading.Thread(target=fun)
t1.start()

def run(self):
    # 必須在建立類的例項物件時指定target
    if self._target:
        self._target(*self._args, **self._kwargs)
複製程式碼

多執行緒修改全域性變數

多個執行緒在操作同一個全部變數的時候,可能導致變數的值和預期的不一樣,引發執行緒安全問題 解決辦法:引入互斥鎖,在關鍵程式碼的前後加入鎖,保證操作變數的原子性(操作變數時程式碼完整執行,期間不能切換到別的執行緒去執行修改變數的操作)

死鎖

執行緒間的資源競爭,多個執行緒中存在多把,都在等待對方先釋放鎖,這樣就導致了死鎖問題

解決辦法:

1. 銀行家演算法
2. 新增超時
3. 不用使用多把鎖複製程式碼

相關文章