python 非同步IO\資料庫\隊列\緩衝

來源:互聯網
上載者:User

標籤:

協程

協程,又稱微線程,纖程。英文名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\資料庫\隊列\緩衝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.