zoukankan      html  css  js  c++  java
  • 同步、异步、阻塞、非阻塞

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

    1、同步

    所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。
    简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
    例如:B/S模式中的表单提交,具体过程是:客户端提交请求->等待服务器处理->处理完毕返回,在这个过程中客户端(浏览器)不能做其他事。

    2、异步

    异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。

    对于通知调用者的三种方式,具体如下:

    • 状态

    即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。

    • 通知

    当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。

    • 回调

    与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。

    例如:B/S模式中的ajax请求,具体过程是:客户端发出ajax请求->服务端处理->处理完毕执行客户端回调,在客户端(浏览器)发出请求后,仍然可以做其他的事。

    3、同步与异步的区别

    总结来说,同步和异步的区别:请求发出后,是否需要等待结果,才能继续执行其他操作。

    4、阻塞与非阻塞

    阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。

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

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

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

    5、阻塞非阻塞与同步异步的区别?(故事篇)

    理解同步阻塞、同步非阻塞、异步阻塞、异步阻塞、异步非阻塞

    同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。

    以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。

    同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。

    • 同步体现在:等待下载完成通知。
    • 阻塞体现在:等待下载完成通知过程中,不能做其他任务处理。

    同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。

    • 同步体现在:等待下载完成通知。
    • 非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条。【小明必须要在两个任务间切换,关注下载进度】

    异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明不做别的事,仍然一直等待“叮”的声音。

    • 异步体现在:下载完成“叮”一声通知。
    • 阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理。

    异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。

    • 异步体现在:下载完成“叮”一声通知。
    • 非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可。【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】

    也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务),在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。

    所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁。在小明的例子中,这个桥梁就是软件“叮”的声音。

  • 相关阅读:
    golang 相关
    ES root用户启动失败can not run elasticsearch as root
    基于 Flink CDC + Hudi 湖仓一体方案实践
    数据平台上云
    多云趋势
    数果实时数仓探索
    宽表的设计
    数仓指标体系
    Hudi在医疗大数据的应用
    Hudi on Flink上手使用总结
  • 原文地址:https://www.cnblogs.com/luyuze95/p/11520945.html
Copyright © 2011-2022 走看看