標籤:
協程
協程,又稱微線程,纖程。英文名Coroutine。一句話說明什麼是線程:協程是一種使用者態的輕量級線程。
協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧儲存到其他地方,在切回來的時候,恢複先前儲存的寄存器上下文和棧。因此:
協程能保留上一次調用時的狀態(即所有局部狀態的一個特定組合),每次過程重入時,就相當於進入上一次調用的狀態,換種說法:進入上一次離開時所處邏輯流的位置。
協程的好處:
- 無需線程環境切換的開銷
- 無需原子伺服器用戶端檔案鎖及同步的開銷
- 方便切換控制流程,簡化編程模型
- 高並發+高擴充性+低成本:一個CPU支援上萬的協程都不是問題。所以很適合用於高並發處理。
缺點:
- 無法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程需要和進程配合才能運行在多CPU上.當然我們日常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。
- 進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程式
Greenlet
1 from greenlet import greenlet 2 3 def test1(): 4 print(1) 5 gr2.switch() 6 print(4) 7 gr2.switch() 8 def test2(): 9 print(2)10 gr3.switch()11 print(5)12 gr3.switch()13 def test3():14 print(3)15 gr1.switch()16 print(6)17 gr1 = greenlet(test1)18 gr2 = greenlet(test2)19 gr3 = greenlet(test3)20 gr1.switch()21 22
View CodeGevent
Gevent 是一個第三方庫,可以輕鬆通過gevent實現並發同步或非同步編程,在gevent中用到的主要模式是Greenlet, 它是以C擴充模組形式接入Python的輕量級協程。 Greenlet全部運行在主程式作業系統進程的內部,但它們被協作式地調度。
1 import gevent 2 3 def test1(): 4 print(1) 5 gevent.sleep(2) 6 print(4) 7 def test2(): 8 print(2) 9 gevent.sleep(1)10 print(5)11 def test3():12 print(3)13 gevent.sleep(0)14 print(6)15 gevent.joinall([16 gevent.spawn(test1),17 gevent.spawn(test2),18 gevent.spawn(test3),19 ])
View Code
python 非同步IO\資料庫\隊列\緩衝