python如何支持并發(fā)方法詳解
由于GIL(Global Interpreter Lock)的存在使得在同一時刻Python進程只能使用CPU的一個核心,也就是對應(yīng)操作系統(tǒng)的一個
內(nèi)核線程,對于一個Python web程序,如果有個請求,并且都是長耗時的計算任務(wù)(占用),這個程序在接受第一個請求后
還能處理別的請求么?假如web程序接受到請求就while True了:
def handle_request(request): while True: pass
從代碼上理解,Python只有一個真正的執(zhí)行線程,代碼走到while True
就占用唯一的一個cpu核心了,它還有機會處理
別的任務(wù)么?
來啟動兩個線程都進行while True ,觀察他們是否都能執(zhí)行來模擬那兩個請求:
import time, threading def f1(name): while True: print(name) time.sleep(1) threading.Thread(target=f1, args=('f1', )).start() threading.Thread(target=f1, args=('f2', )).start()
輸出結(jié)果:
f1
f2
f2f1f2
f1
...
實際上使用Django(一個Python Web 框架)測試,即使一個請求執(zhí)行了while True
這樣的代碼,它還是可以處理別的請求(支持并發(fā));
來解釋一下為什么兩個while True
都能執(zhí)行:
還是用GIL這把鎖,第一個while True
的線程拿到這把鎖才能執(zhí)行,然后它執(zhí)行了一個print(name)
接著把鎖釋放了,
它就暫停了,接著第二個while True
線程拿到GIL后開始執(zhí)行,圍繞GIL交替執(zhí)行,就實現(xiàn)了Python的多線程。
總結(jié)一下:
while True
也不能一直持有CPU資源,它也是執(zhí)行一會歇一會,這就給了其他進程機會,這里面有兩個關(guān)鍵點:
- 如何搶到這把鎖
- 如何釋放鎖
搶鎖,排隊。給lock安排一個隊列,想執(zhí)行的進這個隊列。
釋放鎖的有點類似進程調(diào)度:
- 劃分時間片(執(zhí)行一樣的時間)
- 執(zhí)行指令計數(shù)(執(zhí)行一樣的指令次數(shù))
- 碰到IO操作(被動等待)
- 主動等待(wait/join/sleep)
碰到IO操作,需要等待IO設(shè)備完成計算才能繼續(xù)執(zhí)行線程,這段時間內(nèi)不占用CPU資源,先把鎖釋放了。
主動等待,典型的就是sleep,主動放棄鎖,等到一定時機再重新執(zhí)行。
以上分析 說明Python支持并發(fā),但是由于無法利用多核處理器優(yōu)勢,對于大量并發(fā)下的計算密集型應(yīng)用
不適合使用Python。
到此這篇關(guān)于python如何支持并發(fā)的文章就介紹到這了,更多相關(guān)python支持并發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows上使用Python增加或刪除權(quán)限的方法
下面小編就為大家分享一篇Windows上使用Python增加或刪除權(quán)限的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04