gevent实现的协程是同步非阻塞还是异步非阻塞?
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。