併發篇-python協程!
阿新 • • 發佈:2019-01-05
基於 epoll 的回撥式程式設計模式,但是卻難以使用。即使可以通過配合 生成器協程 進行復雜的封裝,以簡化程式設計難度。
但是仍然有一個大的問題: 封裝難度大,現有程式碼幾乎完全要重寫gevent,通過封裝了 libev(基於epoll) 和 greenlet 兩個庫。做好封裝,允許以類似於執行緒的方式使用協程。
>>>gevent 併發伺服器
進群:960410445 即可獲取數十套PDF!
# 將 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,則阻塞。