1. 程式人生 > >併發篇-python協程!

併發篇-python協程!

基於 epoll 的回撥式程式設計模式,但是卻難以使用。即使可以通過配合 生成器協程 進行復雜的封裝,以簡化程式設計難度。

但是仍然有一個大的問題: 封裝難度大,現有程式碼幾乎完全要重寫gevent,通過封裝了 libev(基於epoll) 和 greenlet 兩個庫。做好封裝,允許以類似於執行緒的方式使用協程。

>>>gevent 併發伺服器

進群:960410445  即可獲取數十套PDF!

 

併發篇-python協程!

 

 

# 將 Python 內建的 socket 直接換成封裝了 IO 多路複用的 socket

>>>from gevent import monkey; monkey.patch_socket()

# 工作協程的內容

>>>def worker_coroutine(conn):

# 生成一個協程,並將 conn 作為引數傳入

>>>gevent.spawn(worker_coroutine, conn)

遇到阻塞就切換到另一個協程繼續執行 !

  • 使用基於 epoll 的 libev 來避開阻塞
  • 使用基於 gevent 的 高效協程 來切換執行
  • 只在遇到阻塞的時候切換,沒有輪詢的開銷,也沒有執行緒的開銷

Gevent 是一個第三方庫,可以輕鬆通過gevent實現協程程,在gevent中用到的主要模式是Greenlet, 它是以C擴充套件模組形式接入Python的輕量級協程。 Greenlet全部執行在主程式作業系統程序的內部,但它們被協作式地排程。

gevent會主動識別程式內部的IO操作,當子程式遇到IO後,切換到別的子程式。如果所有的子程式都進入IO,則阻塞。