Python基礎筆記:執行緒與程序
阿新 • • 發佈:2020-08-05
守護程序
from threading import Thread import time import os def task(name): print('%s is running ' % name) time.sleep(1) print('%s is over ' % name) def test(): time.sleep(3) print('over') if __name__ == '__main__': t = Thread(target=task,args=('lichang',)) test = Thread(target=test) t.daemon = True # 開啟守護執行緒 t.start() test.start() print('主')
執行緒互斥鎖
from threading import Thread, Lock import time money = 100 mutex = Lock() def task(): global money mutex.acquire() tmp = money time.sleep(0.1) money = tmp - 1 mutex.release() if __name__ == '__main__': # mutex = Lock() t_list = [] for i in range(100): t = Thread(target=task) t.start() t_list.append(t) for t in t_list: t.join() print(money) '''資料錯亂,加鎖處理'''
GIL全域性解釋鎖
Python直譯器有多個版本
普遍使用的是Cpython
- GIL不是Python的特點而是Cpython的特點
- GIL是保證直譯器級別的資料安全
- GIL會導致同一個程序下的多個執行緒無法同時執行
- 針對不同的資料還是需要不同的鎖處理
- 解釋型語言的通病:同一個程序下多個執行緒無法利用多核優勢
在cpython直譯器中GIL是一把互斥鎖,用來阻止同一個程序下的多個執行緒的同時執行
同一個程序下的多個執行緒無法利用多核優勢
Python的多執行緒是不是沒有什麼用?
因為Cpython中的記憶體管理不是執行緒安全的
記憶體管理(垃圾回收機制)
- 應用計數
- 標記清除
- 分代回收
同一程序下的多執行緒無法利用多核優勢,是不是就沒什麼用
多執行緒是否有用要看具體情況
多程序:相對浪費資源
多執行緒:更加節省資源
IO密集型\計算密集型
IO密集型條件下使用多執行緒效率更高
計算密集型條件下使用多程序效率更高
多程序和多執行緒都有各自的優勢
並且在實戰寫專案時通常可以:多執行緒下面再開設多執行緒
總結
- 開啟程序的兩種方式
開程序和開執行緒的步驟基本是一樣的,只是匯入的模組不一樣而已
開程序程式碼必須寫在main下面,而開程序則無需這麼做
類的物件呼叫方法
類的繼承重寫Run方法
- TCP服務端實現併發
將接客與服務的活分開
- 執行緒物件的join方法
等待當前執行緒物件結束之後,再繼續往下執行
- 同一個程序內的多個執行緒資料是共享的
同一個程序內可以開設多個執行緒
程序:資源單位
執行緒:執行單位
- 執行緒物件屬性和方法
current_thread
active_count 當前活躍的執行緒
- 守護執行緒
主執行緒必須等待所有非守護執行緒的結束才能結束
t.daemon = True
t.start()
- 執行緒互斥鎖
當多個執行緒在操作同一份資料的時候可能會造成資料的錯亂
這時為了保證資料的安全,我們通常會加鎖處理
鎖:
將併發變成序列,降低了程式的執行效率但是保證了資料的安全
一般不會遇到鎖的問題,底層封裝已處理
- GIL全域性直譯器鎖
1. GIL不是Python的特點而是Cpython的特點
2. GIL本身也是一把互斥鎖,但是它是直譯器級別的
3. 它的存在是因為Cpython直譯器記憶體管理不是執行緒安全
垃圾回收機制
- 應用計數
- 標記清除
- 分代回收
4. 也就意味著GIL的存在導致了同一個程序下的多個執行緒無法利用多核優勢(不能同時執行)
5. 針對不同的資料應該加不同的鎖來保證安全
- python多執行緒是否有用
結合任務的具體型別再做判斷
應該對任務分兩種情況討論
IO密集型
多執行緒更加節省資源
計算密集型
多程序更加合理
多程序和多執行緒均有用,且後面的操作都是多程序加多執行緒從而達到效率最大化