昨天面试被问到了你如何理解同步和异步,我回答的乱七八糟,今天看了某位大佬的简书,总结一下同步异步,阻塞非阻塞!ヾ(o´∀`o)ノ
!!同步:
同步就相当于是 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来不是太友好。**A调用B,B处理直到获得结果,才返回给A。
需要调用者一直等待和确认调用结果是否返回, 然后继续往下执行。**
!!异步:
异步就是,当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。**A调用B,B直接返回。无需等待结果,B通过状态,通知等来通知A或回调函数来处理。调用结果返回时, 会以消息或回调的方式通知调用者。**
举个例子:普通B/S模式(同步)AJAX技术(异步)
!!阻塞:
**A调用B,A被挂起直到B返回结果给A,A继续执行。
调用结果返回前,当前进程挂起不能够处理其他任务,一直等待调用结果返回。**
!!非阻塞:
**A调用B,A不会被挂起,A可以执行其他操作。
调用结果返回前,当前进程不挂起, 可以去处理其他任务。**
举个栗子!!帮助大家区分
::老王过年回家,想要缓存个斗罗大陆看看(由于没钱买会员,只能网站缓存(ಥ﹏ಥ)) ~
1.同步阻塞
老王在某个无提醒功能的网站上缓存斗罗大陆,老王一直停在网站页面缓存什么也不能干,等待视频缓存成功。
同步:没有提醒功能的网站(被调用者)
阻塞:老王(调用者)等待视频缓存成功,什么也不做(当前进程挂起)
总结:调用结果(缓存成功)返回前,进程挂起,等待调用结果返回,效率低。
2.异步阻塞
老王在某个有提醒功能(缓存成功会弹消息提醒)的网站缓存斗罗大陆,老王一直停在网站页面缓存啥也不干,等待视频缓存成功。
异步:有提醒功能的网站(被调用者),缓存成功会提醒老王。(调用结果返回时会通知进程)
阻塞:老王(调用者)等待视频缓存成功,啥都不做(当前进程挂起)
总结:虽然调用结果返回会通知进程,但是调用结果返回前,当前进程挂起。所以同样效率低这里我们可以看出,同步和异步是一种 消息通知机制, 是相对于被调用者而言的。
3.同步非阻塞
老王在某个没有提醒功能的网站缓存视频,然后去干其他事情,时不时来看看是否缓存成功(轮询),老万做其他事情的效率也不高。
同步:没有提醒功能的网站(被调用者),需要老王确认是否缓存成功。
非阻塞:老王(调用者)在缓存视频的时间,去做其他事。
总结:调用结果返回前不会阻塞当前进程,当前进程可以去做其他事情,但是需要通过轮询来确认调用结果是否返回,耗cpu性能,效率会比 1,2 高点,但是还不够高。
4.异步非阻塞
老王在某个有提醒功能的网站缓存视频,然后去做其他事情,在视频缓存成功时会提醒老王。
异步:有提醒功能的网站(被调用者),缓存成功会提醒老王。
非阻塞:老王(调用者)在缓存视频的时间,去做其他事。
总结:调用结果返回前当前进程可以继续做其他事情,函数调用完成后会以回调或者消息的方式通知进程,效率最高。
小结总结!!!
我们要区分开同步异步阻塞非阻塞,同步异步说的是被调用者结果返回时通知进程的一种通知机制,阻塞非阻塞说的是调用结果返回前进程的状态,是挂起还是继续处理其他任务,是相对于调用者而言的。
**python 的 tornado 框架就是一种异步非阻塞框架。**
后续有什么见解会持续更新哒,也可以滴滴我~