多線程2

在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()是一個阻塞函數,會等到線程池全部任務完成後繼續執行

進程池/線程池

本質是一個存儲進程或線程的列表

相關文章
相關標籤/搜索