天天看點

同步異步阻塞非阻塞雜記 gevent實作的協程是同步非阻塞還是異步非阻塞?

版權聲明:本文可能為部落客原創文章,若标明出處可随便轉載。 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。