首页 > 代码库 > 同步/异步,阻塞/非阻塞的个人小总结
同步/异步,阻塞/非阻塞的个人小总结
同步/异步,阻塞/非阻塞的个人小总结
最近一直在用scrapy写编写爬虫程序,在阅读其源码和开源项目的时候,常常会接触到一些网络编程相关的东东。
首先,Scrapy是由Twisted写的一个受欢迎的Python事件驱动网络框架, 它使用的是非堵塞的异步处理。
在网络编程中有 阻塞/非阻塞 和 同步/异步的概念,这里我做了一个总结:因为中文语意的问题,很多时候确实会导致混用,而且语境不一样意义也可能不一样。在这里 网络编程严重区别与线程控制。
线程控制中:
阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。这里重点在于“立即”,一般在等待某种资源或信号量的时候出现,另外还有“挂起”,挂起是一种主动行为,因此恢复也应该要主动完成,而阻塞则是一种被动行为。
同步异步: 同步,同一时间你只能干一件事情,编码中将资源同步,意为为他加锁,同时刻有且只有一个线程拥有该资源;异步,同一时间干很多事情,相互之间也不知道。比如:左右互搏术。
网络I/0编程中:
将IO模型分为五类:阻塞IO,非阻塞IO,IO复用,信号驱动,异步IO其中阻塞IO就是那种recv, read,一直等,等到有了拷贝了数据才返回,简单说就是一定要确定已发送数据成功被接受。
非阻塞就是不用等,立即返回,设置描述符为非阻塞就行了,但是要进程自己一直检查是否可读;
IO复用其实也是阻塞的,不过可以用来等很多描述符;
信号驱动采用信号机制等待;
异步IO就不用等待了,当他告知你的时候,已经可以返回了,数据都拷贝好了。
因此网络编程中有这么一个小段子:
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
老张觉得自己聪明了。
所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。
所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
同步/异步,阻塞/非阻塞的个人小总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。