异步和同步

在编程世界里,「同步」和「异步」是最常见、却又最容易让人混淆的两个概念。几乎所有现代语言都会涉及它们。

两者的特征如下:

  • 同步:顺序执行任务,前一个任务没执行完毕时不会开启下一个任务。
  • 异步:重叠执行任务,前一个任务没执行完毕也可以开启下一个任务。

假设现在需要分别使用洗衣机,电饭煲,和切菜板来进行洗衣服,煮饭,切菜三项家务。

  • 同步:先启动洗衣机洗衣服,等待衣服洗好,去开始切菜,切菜完成后,去使用电饭煲煮饭。
  • 异步:启动洗衣机洗衣服,然后立即使用电饭煲煮饭,启动电饭煲后就直接去切菜。

通过以上例子可以看出,异步相较于同步,大大的提升了工作效率。

但异步并非都是好处。

例如可能忘记取出洗衣机里面的衣服,忘记给电饭煲通上电。又或者限电,同时只能开启一台机器。

而同步则不会面临这些问题,因为每次只做一件事,完成一件再做下一件,流程更可控。

在实际开发中,任何编程语言的代码天然都是同步的,程序会按顺序一步步执行,这让开发者能够更好地控制流程、处理逻辑和调试问题。

但在一些特定场景下,纯同步会导致效率低下,例如:

  • 网络请求:等待远程服务器响应可能耗时较长。
  • 文件或数据库操作:I/O 阻塞会浪费 CPU 时间。
  • 并行计算:多个任务可以同时执行。

这时就需要异步来改进效率:程序可以在等待某些操作完成的同时,去处理其他任务,从而充分利用资源,提高整体吞吐量。

常见的异步实现方法有:

  • 回调,在任务完成后触发一个事先传入的函数,将任务完成后获得的数据传参。但容易出现回调地狱(回调一层套一层),逻辑难以维护。
  • 事件循环,最出名的就是 JS 的事件循环,在单线程环境下,事件循环通过无限循环不断调度任务队列,异步任务完成后会被放入队列等待执行,从而实现非阻塞操作。
  • Promise/Future,表示一个现在不确定但未来会有结果的对象,可以链式处理异步操作,使逻辑更清晰,同时支持错误处理
  • async/await,将异步代码编写的像是同步代码一样。使得易于理解和维护,但具有异步传染性。即调用 async 函数的函数通常也需要标记为 async 。
  • 多线程和并行计算,通过操作系统调度多个线程或进程同时处理任务,充分使用多核处理器。

现代编程语言大多支持异步语法,但像 Rust、Python 等语言仍需要引入第三方库才能真正运行异步任务。

这是因为这些语言在语法层面上支持 async/await 等关键字,但本身并未提供异步运行时。为了让异步任务能够被调度和执行,必须依赖第三方库作为运行时,如 Rust 的 tokio 、Python 的 asyncio trio

总的来说,异步和同步各有利弊,实际开发中通常会根据场景灵活选择。

同步更安全、可预测,保证流程可控的地方用同步。

异步更高效,提高效率的地方用异步,但需要额外的管理和注意。


异步和同步
http://www.inksha.com/archives/yi-bu-he-tong-bu
作者
inksha
发布于
2025年09月26日
许可协议