什么是同步什么是异步:核心区分方法

什么是同步什么是异步,同步是任务按排队顺序执行,前一个任务完全结束之后,才启动下一个任务,期间调用方会阻塞等待结果返回;异步是发起任务后,调用方不用原地阻塞等待,可以继续执行其他代码,任务完成后通过回调、事件或消息通知调用方获取结果。同步适合任务数量少、逻辑简单、必须按顺序执行的场景,比如读取本地小配置文件;异步适合IO密集型任务,例如网络请求、文件读写,在等待外部资源响应时释放主线程算力。该规则不适用于CPU密集型计算场景,这类场景异步无法提升运算速度,额外的调度开销还会降低整体性能。你判断一段代码是同步还是异步,只需要看发起任务后,主线程会不会卡住不动。

同步执行的运行逻辑

同步调用发起请求之后,执行线程暂停后续所有操作,持续等待当前任务完成,拿到返回结果才会继续向下运行。浏览器中同步读取大文件时,页面会直接卡死,就是主线程被阻塞的典型现象。你写简单脚本、小型本地工具时经常用到同步逻辑,代码书写直观,调试难度较低,执行顺序完全贴合代码书写顺序,不会出现回调嵌套带来的顺序混乱问题。

同步的主要短板在于阻塞,一旦任务耗时较长,整个执行线程会停滞。比如同步请求远程接口,网络延迟高的时候,程序界面冻结,用户无法操作。如果你的程序是单线程架构,长时间同步IO会直接中断交互响应。

异步执行的运行逻辑

异步发起任务,会把任务交给底层调度器处理,主线程立刻继续运行后面的逻辑,不会原地等待。等IO操作或者远程请求完成,系统会把完成事件加入任务队列,主线程空闲时再处理结果。常见的异步实现方式包含回调函数、Promise、asyncawait,asyncawait只是语法包装,底层依旧是异步机制。

异步不能加快单个任务本身的处理速度,只是充分利用等待间隙,并行处理别的工作。下载文件的时候,页面依旧可以滚动点击,就是异步带来的效果。

类型阻塞状态执行顺序适用场景
同步调用方阻塞等待严格按代码顺序简短本地计算、顺序强依赖任务
异步调用方不阻塞发起顺序固定,完成顺序不确定网络请求、文件读写等IO任务

判断阻塞是核心。

很多新手会犯一个错误,把多线程和异步混为一谈。异步不一定依赖多线程,JavaScript浏览器环境的异步,基于单线程事件循环模型实现,依靠任务队列调度,并没有开启多条线程。多线程属于操作系统层面能力,异步是任务调度设计模式,二者概念相互独立,可以组合使用,也可以单独存在。

异步开发会增加代码复杂度,异常捕获、任务取消、多个异步任务之间的顺序控制都需要额外处理。连续多个异步请求,返回结果顺序有可能和发起顺序不一致,如果你需要严格有序的结果,就要手动做排序处理。

Node.js文档中大量IO模块同时提供同步版本和异步版本,同步API名称末尾一般带有Sync后缀,例如fs.readFileSync。这类同步API仅推荐在程序启动阶段一次性读取配置使用,业务运行阶段频繁调用,容易造成服务卡顿,并发请求量上涨之后性能衰减会更加明显。

CPU密集型任务,像图片像素运算、大量循环计算,不适合使用异步方案。计算过程不存在等待空闲时间,异步调度产生的任务切换开销,会占用一部分算力,整体耗时反而高于同步执行。这种场景优先使用多线程分担计算压力。

你在开发选型时,优先确认任务属于IO等待类还是计算类。IO等待优先异步;简短且有强顺序依赖的本地任务,直接使用同步代码,减少不必要的开发成本。

当多个异步任务同时执行,需要全部完成之后再继续后续逻辑,你可以使用Promise.all。如果只需要任意一个任务成功就继续执行,使用Promise.race。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于什么是同步什么是异步的文章欢迎访问:百科