【网络编程】- 同步、异步、阻塞与非阻塞的概念浅析

前言

    网络编程方面有些概念被经常提到,如:阻塞、非阻塞等,对这些的概念理解很模糊,所以这次来详细的学习下。

正文

同步与异步

    同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后, 依赖的任务才能算完成,这是一种可靠的任务序列。
    多个任务只能顺序执行,不能并发地执行。
    异步是指一个任务的完成不需要等待被依赖另一个任务的完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。是一种不可靠的任务序列。
    多个任务可以并发执行。

消息通知

    当一个同步调用发出后,调用者要一直等待返回消息通知后,才能进行后续的执行;当一个异步过程调用发出后,调用者不能立即得到返回信息,处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
    比如 我去餐厅吃饭 ,正是饭点吃饭的人很多,可能会有两种选择
    1、我在餐厅排队等候买饭
    2、我在前台登记下我要买的饭,并留下我的电话,等到饭做好了前台打电话通知我。
    第一种选择就是同步的方式
    第二种选择是异步的方式,我在前台留下电话,告诉前台饭做好了给我打电话(相当于在被调用者处注册一个回调机制)。

小结

    同步与异步是针对消息的通知机制来说的,同步时我(调用者)主动去询问消息,异步时我(调用者)是被消息通知。

阻塞与非阻塞

    阻塞调用:调用结果返回之前,当前线程会被挂起(主动),一直处于等待消息通知的状态,不能够执行其它业务,函数只有在得到结果之后才会返回。
    非阻塞调用:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。非阻塞的方式可以明显的提高CPU的利用率,但是系统的线程切换也会增加。
    比如 ,还是去餐厅吃饭的例子,不论我是排队等待还是使用电话通知,在这个等待的过程中,,如果我除了等待消息通知不能做其他的事情,那么就是阻塞的,表现在程序中,就是该程序一致阻塞在该函数调用处不能继续往下执行。
如果我在等待的时候写个博客或者逛个商店,打个电话,这样的状态就是非阻塞的,我(调用者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。

小结

    阻塞和非阻塞是从程序(线程)在等待消息通知时的状态角度来说的。

同步阻塞

    效率最低,专心排队,什么也不能做

异步阻塞

     等待消息时被阻塞,在留下电话后也不能做其它事情

同步非阻塞

    我要一边打电话一边还需要抬头看看队伍排到我了没有,打电话和观察排队的位置的两个程序在来回切换,效率较低。

异步非阻塞

    效率更高 ,打电话时调用者(我)的事情,通知我时前台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

举个例子 :小明的故事

    拿【小明下载文件】来做个例子,进行一个场景预设,来理解下上面提到的概念。

  • 【同步阻塞】小明一直盯着下载进度条,到 100% 的时候就完成。。
同步体现在:等待下载完成通知;
阻塞体现在:等待没有人的时刻的过程中,不能做其他任务处理。
  • 【同步非阻塞】小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
同步体现在:等待下载完成通知;
非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】
  • 【异步阻塞】小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音。
异步体现在:下载完成“叮”一声通知;
阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;
  • 【异步非阻塞】异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
异步体现在:下载完成“叮”一声通知;
非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】

参考资料

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

总结

    下次提到这些概念的时候,是不是就可以侃一波儿了?感谢您的耐心阅读!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的大白啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值