首页 > 代码库 > 同步/异步,阻塞/非阻塞的个人小总结

同步/异步,阻塞/非阻塞的个人小总结

同步/异步,阻塞/非阻塞的个人小总结


最近一直在用scrapy写编写爬虫程序,在阅读其源码和开源项目的时候,常常会接触到一些网络编程相关的东东。

首先,Scrapy是由Twisted写的一个受欢迎的Python事件驱动网络框架, 它使用的是非堵塞的异步处理。 

在网络编程中有 阻塞/非阻塞 和 同步/异步的概念,这里我做了一个总结:
因为中文语意的问题,很多时候确实会导致混用,而且语境不一样意义也可能不一样。在这里 网络编程严重区别与线程控制。

线程控制中:

阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。
这里重点在于“立即”,一般在等待某种资源或信号量的时候出现,另外还有“挂起”,挂起是一种主动行为,因此恢复也应该要主动完成,而阻塞则是一种被动行为。

同步异步: 同步,同一时间你只能干一件事情,编码中将资源同步,意为为他加锁,同时刻有且只有一个线程拥有该资源;异步,同一时间干很多事情,相互之间也不知道。比如:左右互搏术。

网络I/0编程中:

将IO模型分为五类:阻塞IO,非阻塞IO,IO复用,信号驱动,异步IO
其中阻塞IO就是那种recv, read,一直等,等到有了拷贝了数据才返回,简单说就是一定要确定已发送数据成功被接受。
非阻塞就是不用等,立即返回,设置描述符为非阻塞就行了,但是要进程自己一直检查是否可读;
IO复用其实也是阻塞的,不过可以用来等很多描述符;
信号驱动采用信号机制等待;
异步IO就不用等待了,当他告知你的时候,已经可以返回了,数据都拷贝好了。


因此网络编程中有这么一个小段子:
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
老张觉得自己聪明了。


所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。


所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

同步/异步,阻塞/非阻塞的个人小总结