Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >深入理解--异步和非阻塞同步和阻塞异步和非阻塞

深入理解--异步和非阻塞同步和阻塞异步和非阻塞

作者头像
desperate633
发布于 2018-08-22 09:30:39
发布于 2018-08-22 09:30:39
1K0
举报
文章被收录于专栏:desperate633desperate633

异步和非阻塞的概念实际上已经出现了很长一段时间。但是异步真正开始流行起来,是因为AJAX技术逐渐成为主流的web开发技术。非阻塞的概念真正流行起来,是当java引入NIO,也可以称作非阻塞IO的API,开始走进主流的开发人员的视线,真正流行起来,也可以认为是node.js带来的。

同步 ,异步,阻塞,非阻塞这几个概念相互之间联系紧密,很难区分。很多程序员都不知道它们之间的具体的不同。本文就会详细讨论这个问题,希望能帮助读者更好的了解这几个概念

同步和阻塞

首先,我们先开始介绍与异步和非阻塞对立的两个概念:同步和阻塞

对于web开发者来说,理解同步的概念相对比较容易,因为HTTP协议就是一个同步的协议。web浏览器向服务器发送一个请求并且等待它的响应。收到响应之后,浏览器才可以继续向服务器发送下一个请求,并且等待响应,周而复始的重复这个过程。在发送下一个请求之前必须等待响应的到达才行,这就成为了HTTP协议的一个巨大的性能瓶颈,当然为了解决这个问题,后来就出现了异步的AJAX技术。

阻塞的概念相对也是比较容易理解的。我们通过Java中的InputStream类的read方法来介绍阻塞的概念,文档中是这样描述read方法的:

If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown. 意思就是,如果已经到了流的末尾没有可读取的数据,那么就会返回-1。这个方法会一直阻塞,直到有可读取的数据,或者已经读到了流的末尾,或者抛出一个异常。

这个方法的调用会一直阻塞,因为他会一直等待直到输入的数据可以用来读取。这通常会造成性能的瓶颈,因为这个方法会阻塞,导致无法继续执行随后的操作。

异步和非阻塞

异步和非阻塞就是同步和阻塞的相反面。在直觉上,可能会感觉这两个概念会有一些类似,因为他们都可以允许你们的线程在等待结果或者返回的时候不需要挂起整个线程。但是他们又有不同,因为异步调用通常需要包括一个回调机制或者事件机制,去主动通知调用方此时响应的结果已经可用了。而非阻塞调用往往会先返回一个任意的结果,然后调用者会不定时的反复去尝试获取返回的结果,直到结果已经可用了。这里的区别就是一个主动通知和被动去询问。举个例子,你去音乐店买周杰伦的专辑,但老板告诉你,现在没货,你就回去了,等到货到了,准备好了,老板会主动打电话通知你,专辑已经到啦,快来买吧,这就是异步机制,是主动通知的。而非阻塞则是,老板不会主动通知你,而是你自己隔个一两天就去这家店主动问问,专辑到了么,直到有一次你询问的时候,终于发现专辑到了。非阻塞的概念常常用于I/O中,而异步的概念则相对应用的比较广泛。

特别的,异步I/O,意味着I/O操作是独立于当前的那个线程的操作而进行的。可以理解为,另外新开启了一个线程去执行I/O操作,当I/O操作完成之后会主动直接将结果返回。这里说的更详细一点就是,我们知道底层数据准备好之后,还要从内核区域拷贝到线程的缓冲区,非阻塞操作在这种意义上来说,又是同步的,因为非阻塞不会将这个拷贝数据的过程完成,而是当数据准备好了,告诉线程,你可以执行系统调用,将内核区域的数据拷贝到线程的缓冲区了,当然这个过程是同步,而且由于是系统调用,所以这个拷贝的过程也是阻塞的。而异步操作则不是,系统会开启一个线程当数据准备好了,这个线程还会完成这个从内核区将数据拷贝到线程缓冲区的过程,当数据拷贝完成了,才通知调用者,这时候调用者就直接可以用了。

我们在看一个更详细的异步I/O的例子:

我们假设同步I/O意味着发出一个I/O命令,然后一直等待,直到I/O操作完成。也就是说,你发出一个read命令,然后这个线程接下来的执行操作会一直等待,直到已经读到了内容。异步I/O则是你发出一个I/O命令,然后这个I/O不会立即完成。你可以先去执行接下来的程序。异步会实现一个接口,允许IO操作不阻塞当前的线程,而且当操作完成之后,会主动通知你操作已经完成。

Non-blocking 在这里有一个很好的解释: this StackOverflow answer:

This term is mostly used with IO. What this means is that when you make a system call, it will return immediately with whatever result it has without putting your thread to sleep (with high probability). For example non-blocking read/write calls return with whatever they can do and expect caller to execute the call again. try_lock for example is non-blocking call. It will lock only if lock can be acquired. Usual semantics for systems calls is blocking. read will wait until it has some data and put calling thread to sleep. 非阻塞I/O意味着当你发起一个系统调用的时候,他会立即返回一个结果,而不是将你的线程睡眠。非阻塞的读写操作,会收到一个立即的返回值,然后请求者会反复去重试,不断的去尝试,直到可以开始读写操作了。类似于忙等的状态,不断的测试,但是线程没有被阻塞。try_lock就是一个非阻塞的调用,他会尝试去获取锁,直到锁可以获取。通常来说,系统调用会进入内核,一般都是阻塞的,所以read操作往往是阻塞的,会等待可用数据,并且将线程休眠。

现在,我们应该对于异步和非阻塞的概念已经有所了解了。下面我们就举个现实中的例子来加强理解:

例如,传统的sockets API中,一个非阻塞的socket,通常会立即返回一个"would block" 的错误信息,然后需要调用独立的函数select or poll 去轮询检查什么时候可以再次尝试去读取。 但是异步的sockets (windows的sockets支持异步操作),.Net框架中也有异步I/O模型。你调用一个方法开始某个操作,然后 框架会在这个操作完成的时候,回调通知你,操作完成了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.07.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django_rest框架片段高亮显示实践项目(一)url和view里面的代码的书写
和helloWord项目一样,就是建项目,搭建Djangorest的项目,现在因为是做代码片段高亮显示的项目,所以,需要一个新表,所以我们需要在model.py里面写一个实体类
一写代码就开心
2022/01/21
7270
Django_rest框架片段高亮显示实践项目(一)url和view里面的代码的书写
python教程
在做其他事之前,我们会用virtualenv创建一个新的虚拟环境。这将确保我们的包配置与我们正在工作的其他项目完全隔离。
用户2337871
2019/07/19
5.1K0
学生宿舍管理系统(jsp+mysql).rar
Java学生宿舍管理系统,技术架构方面使用jsp+mysql。源代码和数据库脚本齐全。有运行截图。适合大学生毕业设计参考和Java的初步学习者使用。
用户4585225
2020/12/19
3.7K0
学生宿舍管理系统(jsp+mysql).rar
初次就这么给了你(Django-rest-framework)
工程已经创建好了,需要cd进工程里边,关键是manage.py在工程里边,我们就需要借用manage.py来进行其他的操作了。
Wyc
2018/09/11
1.2K0
DRF比Django的认证和权限高在哪里
Django可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF做了高级封装,提供了更简洁的实现方式。我们通过继续学习官网教程来进行了解。
dongfanger
2020/12/22
1.5K0
DRF比Django的认证和权限高在哪里
Django-REST:002-API接口序列化
在这样的处理风格下,目前更加适合项目开发并且成本较低的一种比较流行的开发模式:项目的前后端分离结构模型的优势更加突出,通过RESTful风格指定的格式定义不同的数据处理的请求方式,后端只需要提供对应的接口,前端视图部分负责调用进行数据展示;数据的交互全部交给异步调用进行实现,能最大程度的发挥项目开发过程中开发人员的能力!
大牧莫邪
2018/08/27
1.3K0
【愚公系列】2022年04月 Python教学课程 64-DRF框架之序列化器
在我们做任何其他事情之前,我们将使用venv创建一个新的虚拟环境。这将确保我们的软件包配置与我们正在进行的任何其他项目保持良好的隔离。
愚公搬代码
2022/04/14
8030
揭开DRF序列化技术的神秘面纱
在RESTful API中,接口返回的是JSON,JSON的内容对应的是数据库中的数据,DRF是通过序列化(Serialization)的技术,把数据模型转换为JSON的,反之,叫做反序列化(deserialization)。本文就来揭开DRF序列化技术的神秘面纱。
dongfanger
2020/12/18
6860
揭开DRF序列化技术的神秘面纱
rest_framework -- mi
上面的mixins、generics都是rest_framework里的模块,我们可以继承其中的某些类,达到代码量减少的效果,这里充分体现出了面向对象的继承 一、mixins模块 mixins : from rest_framework import mixins #导入方式 存放一些增删改查的一些类 CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelM
py3study
2020/01/19
5880
DRF终极封装ViewSet和Router附教程PDF源码
在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作。本文是教程的最后一篇,介绍ViewSets和Routers。
dongfanger
2020/12/23
8750
DRF终极封装ViewSet和Router附教程PDF源码
Django REST framework 的快速入门教程
创建一个新的Django项目,叫做 tutorial,然后开始一个新的app叫做 quickstart。
菲宇
2019/06/13
1.4K0
Django REST framework+Vue 打造生鲜超市(四)
五、商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view 利用Django的view实现返回json数据 # goods/view_base.py from django.views.generic import View from goods.models import Goods class GoodsListView(Vie
zhang_derek
2018/04/11
4.8K0
Django REST framework+Vue 打造生鲜超市(四)
django-rest-framewor
REST是一种软件架构设计风格,不是标准,也不是具体的技术实现,只是提供了一组设计原则和约束条件。
py3study
2020/01/20
1.6K0
rest_framework框架的基本组件
快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。 models部分: from django.db import models # Create your models here. class Book(models.Model): title=mod
阿强Wwlt
2018/07/09
8730
django-rest-framework框架学习
现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式。前后端分离方式有许多好处,比如 1、可以前后端并行开发,提高开发效率 2、页面都在客户端进行渲染,提高了渲染速度,减小了服务器的压力 3、一套api提供给多个客户端使用,而且不限制客户端的类型(web,app均可)
earthchen
2020/09/24
1.3K0
DRF使用超链接API实现真正RESTful
很多API并不是真正的实现了RESTful,而应该叫做RPC (Remote Procedure Call 远程过程调用),Roy Fielding曾经提到了它们的区别,原文如下:
dongfanger
2020/12/23
1.2K0
DRF使用超链接API实现真正RESTful
django rest framework通用view
官方文档:http://www.django-rest-framework.org/ drf为我们提供强大的通用view的功能,本博客对这些view进行简要的总结分析。 首先,我们看一下主要的几种view以及他们之间的关系。
程序员同行者
2018/12/12
1K0
Django REST Framework-常用的权限类型
Django REST Framework是一个用于构建Web API的强大框架。其中一个重要的特性是提供了多种权限类型来控制用户对API端点的访问。
玖叁叁
2023/04/25
1.5K0
DRF对Django请求响应做了技术升级
Django视图是用来处理请求和响应的,Django默认是按Form和Template来设计的,如果要处理以JSON格式为主的RESTful API,那么就需要对Django请求和响应的处理代码进行优化改造,本文就来介绍DRF在这一部分的技术升级。
dongfanger
2020/12/21
9310
DRF对Django请求响应做了技术升级
【愚公系列】2022年04月 Python教学课程 65-DRF框架之请求和响应
REST框架引入了一个扩展常规的对象,并提供更灵活的请求解析。该对象的核心功能是属性,它类似于 ,但对于使用 Web API 更有用。
愚公搬代码
2022/04/17
6370
相关推荐
Django_rest框架片段高亮显示实践项目(一)url和view里面的代码的书写
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文