在CPython解釋器中,同一個進程下開啓的多線程,同一時刻只能有一個線程執行,沒法利用多核優點python
GIL本質是一把互斥鎖,保護不一樣的數據的安全,應該加不一樣的鎖web
全部數據都是共享的,代碼做爲一種數據也是被全部線程共享,全部線程的任務,都須要將任務的代碼當作參數傳給解釋器的代碼去執行安全
GIL保護的是解釋器級的數據保護本身的數據須要本身加鎖處理多線程
GIL的存在使得同一時刻統一進程中只有一個線程被執行,由於CPython的內存管理機制非線程安全的,不少其餘的特性依賴於GIL,因此即便它影響了程序效率也沒法去除異步
在CPython中,GIL會把線程的並行變成串行,致使效率下降socket
每當執行一個文件,就會啓動一個python解釋器函數
py文件中的內容本質都是字符串,只有在被解釋器解釋時,才具有語法意義,解釋器會將py代碼翻譯爲當前系統支持的指令交給系統執行線程
有了GIL後,多個線程將不可能在同一時間使用解釋器,從而保證瞭解釋器的數據安全翻譯
GIL的解鎖與解鎖時機進程
加鎖的時機:在調用解釋器時當即加鎖
解鎖時機:
當前線程遇到了IO時釋放
當前線程執行時間超過設定值時釋放,解釋器會檢測線程的執行時間,一旦到達某個閾值,通知線程保存狀態切換線程,以此來保證數據安全
多線程用於IO密集型,如socket,爬蟲,web
多進程用於計算密集型,如金融分析
Pool能夠提供指定數量的進程,供用戶調用,當新的請求提交到pool中時,池未滿,就會建立一個新的進程來執行該請求,若是池中進程數已經達到最大值,那麼該請求就會等待,直到池中有進程結束就重用進程池中的進程
方法:close()關閉進程池
get()返回結果
ready()若是調用完成,返回True
successful()若是調用完成且沒有引起異常,返回True,若是在結果就緒以前調用此方法,引起異常
wait()等待結果變爲可用
terminate()當即終止全部工做進程,,同時不執行任何清理或結束任何掛起工做
進程池,默認參數爲cpu核心數*1
線程池,默認參數爲cpu核心數*5
阻塞 非阻塞
程序遇到了IO操做,沒法繼續執行代碼,叫作阻塞
程序沒有遇到IO操做,正常執行中,就叫非阻塞
他們是指程序運行的狀態
就緒 運行 阻塞
同步 異步
同步(調用/執行/任務/提交),發起任務後必須等待任務結束,拿到一個結果才能繼續運行
異步 發起任務後不關心任務的執行過程,能夠繼續往下運行
異步效率高於同步
可是並非全部任務均可以異步運行,哦按段任務是否能夠異步的條件是,任務發起方是否當即須要執行結果
同步不等於阻塞,異步不等於非阻塞
當使用異步方式發起任務時,任務中可能包含io操做,異步也可能阻塞
同步提交任務可能須要時間,可是不等於阻塞
線程池方法:
submit()以異步的方式提交任務
result()是阻塞的,會等到任務執行完成才繼續執行會異步變成同步
shutdown()是一個阻塞函數,會等到線程池全部任務完成後繼續執行
進程池/線程池
本質是一個存儲進程或線程的列表