同步和异步的区别
用一个生活中最常见的场景——“做饭” 来讲清楚同步和异步的区别。(AI生成)
想象一下,你要做一顿晚饭,包含两个菜:西红柿炒蛋 和一锅需要慢炖的汤。
场景一:同步(Synchronous)—— 死心眼的厨师
你决定用同步的方式来做这顿饭。你的步骤是这样的:
- 开始炖汤:把肉、材料放进锅里,加上水,开大火烧开。
- 等待:你啥也不干,就站在锅旁边,盯着它,直到它“咕嘟咕嘟”烧开。(这就是“阻塞”,你在等待一个任务完成,期间不能做任何别的事)
- 汤烧开了:好,现在你把火调成小火,让它慢慢炖。
- 开始炒菜:现在你才能转身去处理西红柿和鸡蛋,开炒。
- 菜炒好了:菜出锅。
- 汤也炖好了:最后再去关火盛汤。
同步的特点:
- 顺序执行:一件事做完,才能做下一件。
- 全程看守:在等待一个任务(如烧开水)时,你被“卡”住了,不能离开,资源(你这个大厨)被浪费了。
- 结果:这顿饭花了很长时间才做好。而且你站在锅边傻等的那些时间,本来可以拿去切菜、收拾台面,但却白白浪费了。
简单说:同步就是“一根筋”,不做完手上的绝不开始下一件。
场景二:异步(Asynchronous)—— 聪明的主妇
现在,你决定用异步的方式来做这顿饭。你的步骤是这样的:
- 开始炖汤:同样,把肉、材料放进锅里,加上水,开大火烧开。
- 设定闹钟/利用等待时间:你不会傻等。你设置一个厨房定时器(或者心里估摸着时间),然后立刻转身去做别的事。(这就是“非阻塞”,你发起的任务(烧水)在后台自己运行,你可以腾出手来做其他任务)
- 处理其他任务:利用烧水的那几分钟,你去打鸡蛋、切西红柿、准备葱姜蒜。
- 闹钟响了(回调):“叮!” 定时器响了,通知你水烧开了。(这个“叮”的声音,就是所谓的 “回调”(Callback) 或 “通知”(Notification))
- 响应通知:你走过去把火调成小火,让汤慢慢炖。
- 继续做主任务:你回来继续炒菜,因为所有材料都准备好了,很快就能炒好。
- 任务完成:菜炒好了,过了一会儿汤也炖好了,一起出锅。
异步的特点:
- 并发执行:多个任务可以同时推进(烧水的同时你在切菜)。
- 高效利用资源:没有浪费任何等待时间。在“等待”的时候,你去做更有价值的事了。
- 事件驱动/回调:有一个机制(如闹钟)在任务完成时通知你,你再去处理结果。
- 结果:这顿饭用更短的时间就做好了,而且你一点都没闲着,效率极高。
简单说:异步就是“一心多用”,发起任务后就去忙别的,等收到通知再回来处理结果。
总结到编程世界
-
同步代码:就像那个死心眼的厨师。代码执行到
读取一个很大的文件或从网络请求数据时,它会停在那里等,直到拿到结果后才执行下一行代码。用户界面会“卡住”,因为资源被占用了。 -
异步代码:就像那个聪明的主妇。代码执行到
读取文件或网络请求时,它会说:“嘿,系统/浏览器,你去帮我读这个文件(发起任务),读好了回调(Callback)我一下或者通知(Promise/Async await)我一声。” 然后它就去继续执行后面的代码了。等文件读好了,回调函数被触发,再来处理数据。这样用户界面始终是流畅的。
所以,异步编程的核心就是为了避免不必要的等待,最大限度地利用计算资源,让你的程序运行得更高效、更流畅。就像你一边炖汤一边炒菜,而不是守着锅发呆。
浙公网安备 33010602011771号