GIL 執行緒/程序池 同步非同步
GIL
什麼是GIL
全域性直譯器鎖,本質是一把互斥鎖,是加在cpython直譯器上的一把鎖,
同一個程序內的所有執行緒需要先搶到GIL鎖,才能執行python程式碼
為什麼要有GIL
cpython直譯器的記憶體管理機制是非執行緒安全的
GIL與自定義互斥鎖的區別:
相同:都是互斥鎖
不同:GIL是加在直譯器身上,全域性的
自定義作用於區域性
單程序內所有執行緒都會去搶GIL
區域性執行緒會去搶自定義互斥鎖
GIL的優缺點:
優點:保證了cpython直譯器記憶體管理的執行緒安全
缺點:同一程序內的所有執行緒同一時刻內只有一個可以執行,不能並行執行緒
執行緒池,程序池
池:裝固定數目的程序or執行緒
為什麼要用:讓機器在自己可承受的範圍內去保證一個高效的工作
from concurrent.futures import ThreadPoolExecutor ,ProcessPoolExecutor
pool= ProcessPoolExecutor(4)
future = pool.submit(task,arg1,arg2...)是一種非同步提交任務的方式
pool.shutdown()指的是不能再往程序池內提交任務,wait = True 等待程序池或執行緒池內所有的任務都執行完畢
future.result()獲取結果,#非同步提交任務,序列的獲取結果
什麼時候用多程序,什麼時候用多執行緒:
單程序下的多個執行緒是無法並行,無法並行意味著不能利用多核優勢
cpu乾的是計算的活,多個cpu意味著提升了計算效能
cpu是無法做IO操作的,多個CPU在IO操作前毫無用處
當我們的程式是IO密集型時,多核對效能的提升微不足道,此時可使用多執行緒
當我們的程式是計算密集型時,一定要用上多核優勢,可以使用多程序
阻塞與非阻塞:
阻塞:遇到IO就發生阻塞,程式一旦遇到阻塞操作就會停在原地,並且立即釋放CPU資源
非阻塞(就緒或執行態):沒有遇到IO操作,或者通過某種手段讓程式即便是遇到IO也不會停在原地
同步與非同步指的是提交任務的兩種方式
同步呼叫:提交完任務後,就在原地等待,直到任務執行完畢後,拿到任務的返回值,才繼續執行下一行程式碼
非同步呼叫:提交完任務後,不在原地等待,直接直接下一行的程式碼