Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >对于同步、异步、阻塞、非阻塞的几点浅薄理

对于同步、异步、阻塞、非阻塞的几点浅薄理

作者头像
py3study
发布于 2020-01-19 07:30:50
发布于 2020-01-19 07:30:50
5950
举报
文章被收录于专栏:python3python3

首先我们先来看看:

一、同步与异步 同步/异步, 它们是消息的通知机制(都是通过状态、通知、回调函数来返回结果) 1. 概念解释     同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

(按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。 但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。 最常见的例子就是 SendMessage。 该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。 当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。)

    异步

恰恰与同步相反。异步的概念和同步相对。 当一个异步过程调用发出后,调用者不会立刻得到结果。 实际处理这个调用的部件是在调用发出后, 通过状态、通知来通知调用者,或通过回调函数处理这个调用

(以 Socket为例, 当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程不用等待结果,可立刻继续向下运行。 当连接真正建立起来以后,socket底层会发送一个消息通知该对象。)

2.拓展两者在实际程序中的异同:

 在实际的程序中, 同步消息通知机制:就好比简单的read/write 操作,它们需要等待这两个操作成功才能返回;                   同步, 是由处理消息者自己去等待消息是否被触发; 异步消息通知机制:类似于select/poll 之类的多路复用IO 操作,                   当所关注的消息被触发时,由消息触发机制通知触发对消息的处理.                   异步, 由触发机制来通知处理消息者; 还是回到上面的例子, 轮到你办理业务, 这个就是你关注的消息, 而办理什么业务, 就是对这个消息的处理, 两者是有区别的. 而在真实的IO 操作时: 所关注的消息就是     该fd是否可读写,                      而对消息的处理是     对这个fd 进行读写. 同步/异步仅仅关注的是如何通知消息,它们对如何处理消息并不关心, 好比说,银行的人仅仅通知你轮到你办理业务了, 而办理业务什么业务(存钱还是取钱)他们是不知道的. 二、阻塞与非阻塞 阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态.

1. 概念解释     阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

    非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

2. 举例说明 继续上面的那个例子, 不论是排队等待,还是使用号码等待通知, 如果在这个等待的过程中, . 等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的,   表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行. . 相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,   因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待.

三、易混淆的点 很多人也会把异步和非阻塞混淆, 因为异步操作一般都不会在真正的IO 操作处被阻塞, 比如如果用select 函数,当select 返回可读时再去read 一般都不会被阻塞 就好比当你的号码排到时一般都是在你之前已经没有人了,所以你再去柜台办理业务就不会被阻塞. 可见,同步/异步与阻塞/非阻塞是两组不同的概念,它们可以共存组合, 而很多人之所以把同步和阻塞混淆,我想也是因为没有区分这两个概念, 比如阻塞的read/write 操作中,其实是把消息通知和处理消息结合在了一起, 在这里所关注的消息就是fd 是否可读/写,而处理消息则是对fd 读/写. 当我们将这个fd 设置为非阻塞的时候,read/write 操作就不会在等待消息通知这里阻塞, 如果fd 不可读/写则操作立即返回. 四、同步/异步与阻塞/非阻塞的组合分析 _______阻塞____________________非阻塞_____ 同步 | 同步阻塞              同步非阻塞 异步 | 异步阻塞              异步非阻塞 同步阻塞形式:   效率是最低的,   拿上面的例子来说,就是你专心排队,什么别的事都不做。   实际程序中   就是未对fd 设置O_NONBLOCK 标志位的read/write 操作, 异步阻塞形式:   如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发,也就是领了一张小纸条,   假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;   异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息被触发时被阻塞.   比如select 函数,   假如传入的最后一个timeout 参数为NULL,那么如果所关注的事件没有一个被触发,   程序就会一直阻塞在这个select 调用处. 同步非阻塞形式:   实际上是效率低下的,   想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,   如果把打电话和观察排队的位置看成是程序的两个操作的话,   这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;   很多人会写阻塞的read/write 操作,   但是别忘了可以对fd 设置O_NONBLOCK 标志位,这样就可以将同步操作变成非阻塞的了; 异步非阻塞形式:   效率更高,   因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,   程序没有在两种不同的操作中来回切换.   比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,   于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下(注册一个回调函数),   那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了.   如果使用异步非阻塞的情况,   比如aio_*组的操作,当发起一个aio_read 操作时,函数会马上返回不会被阻塞,

  当所关注的事件被触发时会调用之前注册的回调函数进行处理

以上浅薄的理解,是从我结合另一个博客理解总结过来的,或许理解的不是很完善,以尽心尽力!

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
总是搞不懂的同步异步,阻塞非阻塞
最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。
码哥字节
2020/05/17
9220
15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!
是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
Bug开发工程师
2020/03/02
8.4K0
阻塞和非阻塞、同步和异步的讲解
我个人对于网络编程有着强烈的兴趣,最近打算开始看 muduo 的网络库,了解到其构建了基于 Reactor 的事件处理机制,本质涉及 I/O 多路复用的知识。为了后续的理解,首先搞清楚一个有无数讲解却又令人费解的概念:阻塞和非阻塞、同步和异步。
泽霖
2023/11/26
2220
重新认识同步与异步,阻塞和非阻塞的概念
在实际的开发中,我们经常会听到同步,异步,阻塞,非阻塞这些编程概念,每次遇到的时候都会蒙圈,然后就各种查网上似是而非的资料,结果越查越迷糊,大部分文章都千篇一律,没有说到本质上的区别,所以下次再碰到这些概念,印象还是比较模糊,尤其是在一些场景下同步与阻塞,异步与非阻塞感觉没啥区别,但其实这四个术语描述的事物还真不是一回事。
我是攻城师
2018/07/23
6600
重新认识同步与异步,阻塞和非阻塞的概念
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
本文会涉及到阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO等几个知识点,知识点虽然不难但经常容易搞混,这次带领大家再回顾一遍。
码农编程进阶笔记
2021/07/20
4210
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
网络编程 同步,阻塞,异步,非阻塞之区别
同步是在操作系统层面上,阻塞是在套接字上 Reactor是同步 Proactor是异步?
苦叶子
2023/06/09
4350
网络编程 同步,阻塞,异步,非阻塞之区别
通俗讲解 同步、异步、阻塞、非阻塞 编程
# 真正意义上的 异步IO 是说内核直接将数据拷贝至用户态的内存单元,再通知程序直接去读取数据。
全栈程序员站长
2022/09/05
3970
同步与异步 阻塞与非阻塞
          1)排队分为在队伍中等待和取号等待两种。在队伍中等待,那么我就需要不断的看看前面的人办理完了没。如果选择取号等待,那么我就比较安逸了,我就不必去管前面的人是否已经办理,我只需要等待别人通知我就行了。也就是这两种方式,一种是自己去做,一种是别人来做。二者孰优孰劣,一目了然。
用户3003813
2018/09/06
1.2K0
进程理论基础
进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。
全栈程序员站长
2022/07/21
4290
进程理论基础
浅析同步异步阻塞非阻塞
企鹅号小编
2018/01/09
2.1K0
浅析同步异步阻塞非阻塞
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
黄规速
2022/04/14
3K0
socket阻塞与非阻塞,同步与异步、I/O模型
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
用户6280468
2022/03/21
3.5K0
socket阻塞与非阻塞,同步与异步、I/O模型
socket阻塞与非阻塞,同步与异步I/O模型
作者:huangguisu 原文出处:http://blog.csdn.net/hguisu/article/details/7453390
bear_fish
2018/09/20
3.6K0
socket阻塞与非阻塞,同步与异步I/O模型
传统同步阻塞和异步非阻塞的区别理解
同步与异步的理解 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。 异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。 异步调用,要想获得结果,一般有两种方式: 1、主动轮询异步调用的结果; 2、被调用方通过callback来通知调用方调用结果。
小勇DW3
2019/11/10
1.1K0
Python--进程
进程:正则进行的一个过程或者说一个任务,而负责执行任务的则是CPU。进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统基础的结构。早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
py3study
2020/01/19
8850
基本概念1 同步和异步2 阻塞和非阻塞3 5.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock)
1 同步和异步 同步和异步关注的是消息通信机制 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。就是由调用者主动等待这个调用的结果。 而异步则是相反,调用在发出之后,这个调用就会立即返回,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。 举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等
JavaEdge
2018/05/16
1.3K0
异步调用的理解
关于这个概念看了许多解释,都是似是而非,并不能完全get到点。个人认为从进程间通信的角度理解比较好,在《操作系统》中关于的部分是这样解释的:
全栈程序员站长
2022/09/18
9840
异步和同步的区别
”同步“就好比:你去外地上学(人生地不熟),突然生活费不够了;此时你决定打电话回家,通知家里转生活费过来,可是当你拨出电话时,对方一直处于待接听状态(即:打不通,联系不上),为了拿到生活费,你就不停的oncall、等待,最终可能不能及时要到生活费,导致你今天要做的事都没有完成,而白白花掉了时间。 “异步”就是:在你打完电话发现没人接听时,猜想:对方可能在忙,暂时无法接听电话,所以你发了一条短信(或者语音留言,亦或是其他的方式)通知对方后便忙其他要紧的事了;这时你就不需要持续不断的拨打电话,还可以做其他事情;待一定时间后,对方看到你的留言便回复响应你,当然对方可能转钱也可能不转钱。但是整个一天下来,你还做了很多事情。 或者说你找室友临时借了一笔钱,又开始happy的上学时光了。 简而言之,言而总之:同步就是我强依赖你(对方),我必须等到你的回复,才能做出下一步响应。即我的操作(行程)是顺序执行的,中间少了哪一步都不可以,或者说中间哪一步出错都不可以,类似于编程中程序被解释器顺序执行一样;同时如果我没有收到你的回复,我就一直处于等待、也就是阻塞的状态。 异步则相反,我并不强依赖你,我对你响应的时间也不敏感,无论你返回还是不返回,我都能继续运行;你响应并返回了,我就继续做之前的事情,你没有响应,我就做其他的事情。也就是说我不存在等待对方的概念,我就是非阻塞的。 从上面的例子来看:同步似乎等价于阻塞,异步则等价于非阻塞。其实有些狭义,但不可否认的是,在一定情况下,确实可以这么认为;因为同步一定存在着阻塞状态,而异步一定不存在非阻塞的状态。 但是不是就是说 同步调用 == 阻塞调用呢?然并不是;阻塞和非阻塞强调的是程序在等待调用结果(消息,返回值)时的状态.  阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。 对于同步调用来说,很多时候当前线程还是激活的状态,只是从逻辑上当前函数没有返回而已,即同步等待时什么都不干,白白占用着资源。同步和异步强调的是消息通信机制 (synchronous communication/ asynchronous communication)。所谓同步,就是在发出一个”调用”时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由“调用者”主动等待这个“调用”的结果。而异步则是相反,”调用”在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在”调用”发出后,”被调用者”通过状态、通知来通知调用者,或通过回调函数处理这个调用。段落参考原文链接:https://blog.csdn.net/qq_43196107/article/details/89679123
kirin
2020/05/25
1.1K0
"女票"竟然问我什么是同步、异步、阻塞、非阻塞?
大家应该看标题就知道了,今天要通过大白话+图形跟我女票(哪里来的女票?假想一下)讲解同步、异步、阻塞、非阻塞、并行、并发的理解。我女票是一个爱问问题的人,最喜欢没事问计算机方面的,尽管她是一名数学教师,尽管她学过计算机编程;但是我认为她啥都不会,有时候在我烦躁的问我,我会冲她发脾气,这里呢,认认真真(当面)跟女票道个歉,她纯粹是想帮我分忧解难。
我是阿沐
2021/06/01
6380
也谈应用程序级的同步、异步、阻塞、非阻塞
这几个经常出现的词汇很容易会引起大家的误解,第一次接触相关词汇是在课上,当时上操作系统的老师说得比较模糊(阻塞==同步,非阻塞==异步),当时觉得挺对 的,
chain
2018/08/02
1.1K0
相关推荐
总是搞不懂的同步异步,阻塞非阻塞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档