版權聲明:本文可能為部落客原創文章,若标明出處可随便轉載。 https://blog.csdn.net/Jailman/article/details/78498458
gevent實作的協程是同步非阻塞還是異步非阻塞?
gevent是一個使用完全同步程式設計模型的可擴充的異步I/O架構。
IO
是不是阻塞的和協程是沒有關系的,
python
本來就能支援
非阻塞IO
,
比如在
linux
隻要用
API
,更改了檔案描述符的屬性就可以
協程
是同步的,并不是異步的,
gevent
除了協程的支援還要有比如
同步非阻塞IO
才行。
nodejs
的底層的實作支援
異步非阻塞IO
協程隻是改變了寫東西的方式,其實實際的東西是沒有太大變化的,單線程的代碼還是會在單線程上跑,
不過配合
非阻塞IO
可以更好的做東西,
golang
的協程支援多線程
同步,異步概念
1.同步就是發生調用時,一定等待結果傳回,整個調用才結束;
2.異步就是發生調用後,立即傳回,不等待結果傳回。被調用者通過狀态、通知來通知調用者,或通過回調函數處理這個調用。
同步異步與阻塞,非阻塞差別
1.阻塞/非阻塞, 它們是程式在等待消息(無所謂同步或者異步)時的狀态;
2.同步/異步,是程式獲得關注消息通知的機制。
同步異步與阻塞,非阻塞組合
1.同步阻塞
效率最低(日志程式)。
2.同步非阻塞
效率也不高(需要輪詢)。
3.異步阻塞
一般模式線程回調。
4.異步非阻塞
IOCP。
伺服器端程式設計經常需要構造高性能的IO模型,常見的IO模型有四種:
(1)同步阻塞IO(Blocking IO):即傳統的IO模型。
(2)同步非阻塞IO(Non-blocking IO):預設建立的socket都是阻塞的,非阻塞IO要求socket被設定為NONBLOCK。注意這裡所說的NIO并非Java的NIO(New IO)庫。
(3)IO多路複用(IO Multiplexing):即經典的Reactor設計模式,有時也稱為異步阻塞IO,Java中的Selector和Linux中的epoll都是這種模型。
(4)異步IO(Asynchronous IO):即經典的Proactor設計模式,也稱為異步非阻塞IO。