同步异步、阻塞非阻塞
同步和异步
-
同步:
- 请求方发起一个请求
- 如果
- 一直卡住并询问结果,不往下执行了,那就是同步阻塞
- 先立即返回,往下执行,但需要每隔一小段时间过来问结果,那就是同步非阻塞
-
异步
- 请求方发起一个请求
- 如果
- 一直卡住等对方通知结果,那就是异步阻塞
- 本质和同步阻塞差不多,但区别是自己不用一直问了,可以停下手中的活,等对方通知
- 先立即返回,然后往下执行,等对方通知结果,那就是异步非阻塞
- 一直卡住等对方通知结果,那就是异步阻塞
-
这么看来同步阻塞简直是效率极低,但其实不是的
- 因为操作系统可以分出几千个线程,然后让同步阻塞的线程进入休眠,等过会再让它醒来,然后它以为自己一直在询问中,这时候经过一段时间,一般都能成功拿到结果
-
异步非阻塞也不是效率最高的
- 因为需要管理很多个挂起的请求,用统一的内部循环来检查是否有请求可以进行通知
- 由于js是单线程的语言,所以天生擅长异步非阻塞
阻塞和非阻塞
从上面例子看出,需要等待的情况下,立即返回就是非阻塞,不返回就是阻塞。
阻塞不一定不好,因为有更高层次的力量(操作系统)在优化全局资源