1. 程式人生 > >Python11/12--GIL/互斥鎖/進程池

Python11/12--GIL/互斥鎖/進程池

參與 mil 啟動 back 除了 不能 自動選擇 下載任務 定義

GIL
1.全局解釋器鎖?
鎖就是線程裏面那個鎖
鎖是為了避免資源競爭造成數據的錯亂

2.python程序的執行過程?
1.啟動解釋器進程 python.exe
2.解析你的py文件並執行它

每個py程序中都必須有解釋器參與,解釋器其實就是一堆代碼
相當於多個線程要調用同一個解釋器代碼,共享以為競爭,競爭就要出事
給解釋器加互斥鎖

python 中內存管理依賴於 GC(一段用於回收內存的代碼),也需要一個線程
除了你自己開的線程,系統還有一些內置線程,就算你的代碼不會去競爭解釋器,內置線程也可能會競爭,所以必須加上鎖
當一個線程遇到了IO 同時解釋器也會自動解鎖  去執行其他線程  CPU會切換到其他程序



解釋器加鎖以後?
將導致所有線程只能並發不能達到真正的並行,意味著同一時間只有一個CPU在處理你的線程,給你的感覺是效率低

代碼執行有兩種狀態?
阻塞 i/o:失去CPU的執行權 (CPU等待IO完成)
非阻塞:代碼正常執行,比如循環一千萬次,中途CPU可能很快會切換回來 (CPU在計算)

案例:
假如有32核CPU ,要處理一個下載任務 ,網絡速度慢 100k/s ,文件大小為1024kb
如果你的代碼中IO操作非常多 cpu性能不能直接決定你的任務處理速度

目前有三個任務 每個任務處理需一秒 獲取元數據需要一小時
3個CPU 需要 一小時1秒
1個cpu 需要 一小時3秒


在IO密集的程序中 CPU性能無法直接決定程序的執行速度 python就應該幹這種活兒
在計算密集的程序中 CPU性能可以直接決定程序的執行速度

GIL 和 自定義互斥鎖的區別?
全局鎖不能保證自己開啟的線程安全,但是保證解釋器中的數據的安全的
GIL 在線程調用解釋器時 自動加鎖,在IO阻塞時或線程代碼執行完畢時 自動解鎖


進程池?
就是一個裝進程的容器
為什麽出現?
當進程很多的時候方便管理進程
什麽時候用?
當並發量特別大的時候 例如雙十一
很多時候進程是空閑的 就讓他進入進程池 讓有任務處理時才從進程池取出來使用
進程池使用
ProcessPoolExecutor類

創建時指定最大進程數 自動創建進程
調用submit函數將任務提交到進程池中
創建進程是在調用submit後發生的

總結一下:
進程池可以自動創建進程
進程限制最大進程數
自動選擇一個空閑的進程幫你處理任務

進程什麽時候算是空閑?
代碼執行完算是空閑

IO密集時 用線程池
計算密集時 用進程池

Python11/12--GIL/互斥鎖/進程池