前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >同步、异步与阻塞、非阻塞

同步、异步与阻塞、非阻塞

作者头像
py3study
发布于 2020-01-16 07:43:28
发布于 2020-01-16 07:43:28
2.2K0
举报
文章被收录于专栏:python3python3

1. 同步与异步

  同步和异步关注的是消息通信机制。同步就是在发出一个【调用】时,在没有拿到结果之前,该【调用】就不返回,但是一旦调用返回,就得到返回值了。

  换句话说,就是由【调用者】主动等待这个【调用】的结果。

  而异步正好相反,【调用】在发出之后,这个调用就直接返回了,所以没有返回结果。也就是说,当一个异步过程调用发出后,调用者不会立刻得到结果

  而是在【调用】发出后,【被调用者】通过状态、通知来通知调用者,或通过回调函数处理这个调用。

  举个例子:

  你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等一下,我查一下,然后开始查啊查,等查好了(可能是

  5秒,也可能是一天)告诉你结果(返回结果)。

  而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂了电话(不返回结果),然后查好了,他会主动打电话给你。在这里

  老板通过<回电>这种方式来回调。

总结:

同步和异步针对应用程序来说,关注的是程序中间的协作关系。

  同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。

  异步:执行一个操作之后,可以去执行其他操作,然后等待通知再回来执行刚才没执行完的操作。

1. 阻塞与非阻塞

  阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

  阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。

  非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  还是上面的例子:

  你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞调用,你会一直把自己挂起,直到得到这本书有没有的结果,如果是非阻塞调用

  你不管老板有没有告诉你,你自己先一边去玩了,当然你也要偶尔过几分钟check一下老板有没有返回结果。

  阻塞与非阻塞与是否同步异步无关。

总结:

阻塞:进程给CPU传达一个任务之后,一直在等待CPU处理完成,然后才执行后边的操作。

  非阻塞:进程给CPU传达一个任务之后,继续处理后续的操作,隔段时间再来询问之前的操作是否完成,这样的机制也叫轮询。

  参考网址:

https://www.zhihu.com/question/19732473

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CompletableFuture 异步处理
我们传统的程序都是单线程的,程序的运行是同步的。(一个执行完一个执行) 比如查询A表要20秒 ,查询B表也要20秒 那么在同步执行的情况下总共需要40秒的时间。 而异步处理是将这2个查询异步的去进行,总共只需要20秒,极大的提高了系统的吞吐量。异步就是从主线程发射一个子线程来完成任务.
默 语
2024/11/20
1170
CompletableFuture 异步处理
基本概念1 同步和异步2 阻塞和非阻塞3 5.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock)
1 同步和异步 同步和异步关注的是消息通信机制 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。就是由调用者主动等待这个调用的结果。 而异步则是相反,调用在发出之后,这个调用就会立即返回,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。 举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等
JavaEdge
2018/05/16
1.3K0
Nginx为什么比Apache 高效
什么是阻塞:就是线程在执行IO操作获取数据时,这个IO可能会需要一定的时间才能等到数据返回,然后才能接着执行下面的命令。那么,此时,这个线程的等待状态我们就把它称为阻塞。没有充分利用起cpu的资源。 什么是非阻塞:还是这个线程在进行 IO操作时,无需等待数据的返回,可以接着往下执行代码命令。cpu资源一直在充分利用。 什么是同步和异步:同步指的当线程进行IO操作请求数据时,是你主动”关心”数据的返回。异步是当前线程无需主动关心数据是否返回,当数据返回时,会有相关的事件通知你。 举个通俗的例子: 你打电话问
老七Linux
2018/05/09
9840
apache和nginx那点事儿--阻塞和异步
先明白的事儿:当一个程序在执行的时候,一般会创建一个进程,也可以有多个进程。一个进程至少会创建一个线程,多个线程共享一个程序进程的内存。程序的运行最终是靠线程来完成操作的。线程的数量跟CPU核数有关,一个核最多能发出两个线程。线程的操作主要分为:一:给CPU进行程序命令的执行。二:IO的操作(读取或输出数据)或者请求网络数据。
后端技术探索
2018/08/10
1.1K0
Linux下的5种IO模型的小结(转)
  接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous)、异步(ASynchronous)、阻塞(blocking)和非阻塞(non-blocking)。关于概念的区别在知乎上看到一位朋友(链接)打了一个比较形象的比喻:
用户6754675
2020/03/16
7390
在Centos下对Tornado的性能进行测试
    在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的后端服务进行性能测试,得出结论单台django在简单读库操作下只能抗住大约200左右的并发:在Centos下使用Siege对Django服务进行压力测试
用户9127725
2022/08/08
7890
在Centos下对Tornado的性能进行测试
重新认识同步与异步,阻塞和非阻塞的概念
在实际的开发中,我们经常会听到同步,异步,阻塞,非阻塞这些编程概念,每次遇到的时候都会蒙圈,然后就各种查网上似是而非的资料,结果越查越迷糊,大部分文章都千篇一律,没有说到本质上的区别,所以下次再碰到这些概念,印象还是比较模糊,尤其是在一些场景下同步与阻塞,异步与非阻塞感觉没啥区别,但其实这四个术语描述的事物还真不是一回事。
我是攻城师
2018/07/23
6590
重新认识同步与异步,阻塞和非阻塞的概念
同步(Synchronous)和异步(Asynchronous)的理解和区别讲解
我后面自己做了详细的2次整理 基础 完整版 有兴趣的同学自行查看;都附有代码demo 方便大家理解
默 语
2024/11/20
9020
同步(Synchronous)和异步(Asynchronous)的理解和区别讲解
通俗讲解 同步、异步、阻塞、非阻塞 编程
# 真正意义上的 异步IO 是说内核直接将数据拷贝至用户态的内存单元,再通知程序直接去读取数据。
全栈程序员站长
2022/09/05
3960
网络编程 同步,阻塞,异步,非阻塞之区别
同步是在操作系统层面上,阻塞是在套接字上 Reactor是同步 Proactor是异步?
苦叶子
2023/06/09
4330
网络编程 同步,阻塞,异步,非阻塞之区别
异步和同步的区别
”同步“就好比:你去外地上学(人生地不熟),突然生活费不够了;此时你决定打电话回家,通知家里转生活费过来,可是当你拨出电话时,对方一直处于待接听状态(即:打不通,联系不上),为了拿到生活费,你就不停的oncall、等待,最终可能不能及时要到生活费,导致你今天要做的事都没有完成,而白白花掉了时间。 “异步”就是:在你打完电话发现没人接听时,猜想:对方可能在忙,暂时无法接听电话,所以你发了一条短信(或者语音留言,亦或是其他的方式)通知对方后便忙其他要紧的事了;这时你就不需要持续不断的拨打电话,还可以做其他事情;待一定时间后,对方看到你的留言便回复响应你,当然对方可能转钱也可能不转钱。但是整个一天下来,你还做了很多事情。 或者说你找室友临时借了一笔钱,又开始happy的上学时光了。 简而言之,言而总之:同步就是我强依赖你(对方),我必须等到你的回复,才能做出下一步响应。即我的操作(行程)是顺序执行的,中间少了哪一步都不可以,或者说中间哪一步出错都不可以,类似于编程中程序被解释器顺序执行一样;同时如果我没有收到你的回复,我就一直处于等待、也就是阻塞的状态。 异步则相反,我并不强依赖你,我对你响应的时间也不敏感,无论你返回还是不返回,我都能继续运行;你响应并返回了,我就继续做之前的事情,你没有响应,我就做其他的事情。也就是说我不存在等待对方的概念,我就是非阻塞的。 从上面的例子来看:同步似乎等价于阻塞,异步则等价于非阻塞。其实有些狭义,但不可否认的是,在一定情况下,确实可以这么认为;因为同步一定存在着阻塞状态,而异步一定不存在非阻塞的状态。 但是不是就是说 同步调用 == 阻塞调用呢?然并不是;阻塞和非阻塞强调的是程序在等待调用结果(消息,返回值)时的状态.  阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。 对于同步调用来说,很多时候当前线程还是激活的状态,只是从逻辑上当前函数没有返回而已,即同步等待时什么都不干,白白占用着资源。同步和异步强调的是消息通信机制 (synchronous communication/ asynchronous communication)。所谓同步,就是在发出一个”调用”时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由“调用者”主动等待这个“调用”的结果。而异步则是相反,”调用”在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在”调用”发出后,”被调用者”通过状态、通知来通知调用者,或通过回调函数处理这个调用。段落参考原文链接:https://blog.csdn.net/qq_43196107/article/details/89679123
kirin
2020/05/25
1.1K0
对于同步、异步、阻塞、非阻塞的几点浅薄理
一、同步与异步 同步/异步, 它们是消息的通知机制(都是通过状态、通知、回调函数来返回结果) 1. 概念解释     同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
py3study
2020/01/19
5920
今天不如来复习下Python基础
01 python是什么? Python是一种解释型语言。这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译。其他解释型语言还包括PHP和Ruby。 Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型。你可以直接编写类似x=111和x="I'm a string"这样的代码,程序不会报错。 Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(inheritance)的方式定义类(class)。Python中没有访问说
用户1332428
2018/03/08
1.1K0
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
用户6280468
2022/03/21
3.5K0
socket阻塞与非阻塞,同步与异步、I/O模型
Echo 的发帖操作是怎么做的
最常用最原始的,form 表单。通过 form 表单以 post/get 方式提交数据,当你点击 submit 按钮时,浏览器会把你在 input 里面输入的数据提交到 form 表单中的 action 这个路径。
飞天小牛肉
2021/04/08
1.3K0
浅谈网络编程
第二种情况,接收端只收到一个数据包,由于TCP是不会出现丢包的,所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。
黄啊码
2021/01/17
6350
同步异步阻塞非阻塞详解
同步就是一个调用方发出请求开始,就一直处于等待状态,等待请求结果返回后才能继续执行其他任务。比如说调用一个函数,等待函数结果返回,这叫同步。
opencode
2022/12/26
2.1K0
阻塞和非阻塞、同步和异步的讲解
我个人对于网络编程有着强烈的兴趣,最近打算开始看 muduo 的网络库,了解到其构建了基于 Reactor 的事件处理机制,本质涉及 I/O 多路复用的知识。为了后续的理解,首先搞清楚一个有无数讲解却又令人费解的概念:阻塞和非阻塞、同步和异步。
泽霖
2023/11/26
2210
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
黄规速
2022/04/14
2.9K0
socket阻塞与非阻塞,同步与异步、I/O模型
15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!
是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
Bug开发工程师
2020/03/02
8.4K0
推荐阅读
相关推荐
CompletableFuture 异步处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档