当前位置:首页 > 技术分析 > 正文内容

异步 vs 同步:程序员必备的核心知识,理解这两者差异,你就是高手

ruisui884个月前 (01-14)技术分析20

1、同步执行(Synchronous Execution)

定义: 同步执行是指程序按顺序执行,每个操作必须等待前一个操作完成才能继续进行。也就是说,程序在执行过程中会“阻塞”当前的任务,直到该任务完成才会继续执行下一个任务。

特点:

  • 顺序执行:任务是按顺序执行的,必须等一个任务完成才能执行下一个任务。
  • 阻塞:每个操作会阻塞程序的执行,直到当前任务执行完毕。
  • 简单易懂:逻辑清晰,执行流程简单。程序会依次完成每个操作,错误也容易追踪。

示例

pythonCopy Codedef task1():
    print("Task 1 starts")
    time.sleep(2)  # 模拟一个耗时操作
    print("Task 1 ends")

def task2():
    print("Task 2 starts")
    time.sleep(2)  # 模拟另一个耗时操作
    print("Task 2 ends")

# 同步执行
task1()
task2()

在这个示例中,task2() 必须等到 task1() 执行完并休眠结束后才能开始执行。这意味着 task1 和 task2 是顺序执行的,总共耗时 4 秒。

2、异步执行(Asynchronous Execution)

定义: 异步执行允许程序在等待某个操作完成的同时,继续执行其他操作。它不会阻塞程序,而是通过事件循环(Event Loop)调度来在等待的过程中处理其他任务,直到需要等待的任务完成。

特点:

  • 非阻塞:异步操作不会阻塞程序的执行,程序可以在等待某个操作的同时执行其他任务。
  • 高效:适合 I/O 密集型的操作(如文件读取、网络请求、数据库查询等),可以显著提高程序效率,减少空闲等待的时间。
  • 复杂:逻辑相对复杂,需要处理任务的调度、协程的生命周期和错误捕获等问题。

示例

pythonCopy Codeimport asyncio

async def task1():
    print("Task 1 starts")
    await asyncio.sleep(2)  # 异步等待,非阻塞
    print("Task 1 ends")

async def task2():
    print("Task 2 starts")
    await asyncio.sleep(2)  # 异步等待,非阻塞
    print("Task 2 ends")

# 异步执行
async def main():
    await asyncio.gather(task1(), task2())  # 同时执行两个任务

asyncio.run(main())

在这个示例中,task1() 和 task2() 会同时开始执行,asyncio.sleep() 是非阻塞的。由于它们都是异步的,它们在等待的同时可以同时执行其他任务。最终的执行时间是 2 秒,而不是同步执行时的 4 秒。

3、主要区别:

特性

同步执行(Synchronous)

异步执行(Asynchronous)

执行方式

阻塞式,按顺序执行每个任务

非阻塞式,任务并行执行,等待期间可以执行其他任务

资源消耗

如果有大量 I/O 操作,会浪费大量的时间,资源利用率低

适合 I/O 密集型任务,可以在等待时进行其他任务,提高资源利用率

代码结构

代码简洁,流程清晰,易于理解

需要处理事件循环、协程等概念,代码结构较为复杂

适用场景

适用于 CPU 密集型计算任务,任务执行时间较短或没有 I/O 操作

适用于 I/O 密集型任务,如网络请求、文件操作、数据库查询等

并发性

不支持并发,任务按顺序执行

支持并发,多个任务可以同时进行(不阻塞其他任务的执行)

性能

在 I/O 操作时性能差,容易浪费 CPU 时间

可以提高效率,减少等待时间,特别是在 I/O 密集型应用中

错误处理

异常发生时会立即终止并报错

异常处理需要额外的设计,可能影响其他任务的执行

4、何时使用异步和同步?

  • 同步执行
    • 适用于 CPU 密集型任务,比如大规模数据处理、复杂计算、图像处理等。因为这些任务大部分时间都在进行计算而不是等待外部资源。
    • 如果任务之间有强依赖关系,必须按顺序执行,使用同步会更简单直观。
  • 异步执行
    • 适用于 I/O 密集型任务,比如网络请求、文件操作、数据库访问等。因为这些任务的大部分时间是等待 I/O 操作完成,异步可以充分利用等待时间进行其他操作,提高程序效率。
    • 在 Web 服务、爬虫、数据抓取等场景中,异步执行能显著提高并发处理能力。

5、异步与同步的性能对比:

  • 同步:在进行 I/O 操作时(如读取文件、访问数据库、发送 HTTP 请求等),每个操作会阻塞当前线程,直到操作完成才能继续下一个任务。这样如果需要处理大量 I/O 操作,程序的效率就会降低。
  • 异步:通过事件循环,异步方法允许在等待 I/O 操作完成的同时,继续执行其他任务。特别是在 I/O 密集型应用中,异步可以显著减少不必要的等待时间,从而提高程序的吞吐量和响应速度。

总结:

  • 同步适用于任务之间没有明显依赖关系,且任务本身是计算密集型的场景。
  • 异步适用于大量 I/O 密集型操作的场景,可以显著提高程序的效率和响应性,特别是在需要高并发处理时。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/279.html

标签: 异步同步
分享给朋友:

“异步 vs 同步:程序员必备的核心知识,理解这两者差异,你就是高手” 的相关文章

云时代,Linux和容器为王,微软推出自己的发行版Azure Linux

看到今天的微软,其前CEO史蒂夫.鲍尔默肯定会后悔在15年前说过的一句话“Linux 是一种癌症(Linux is a cancer)”。 因为今天的微软不光靠Linux赚的钵满盆满,而且还发行了自己的Linux发行版Azure Linux。为了提高其云服务和容器化服务水平,其Azure公有云平台提...

gitlab常用命令大全

GitLab常用命令大全GitLab是一个基于Git的Web平台,它不仅提供代码托管,还集成了持续集成/持续交付(CI/CD)、代码审查、问题追踪等功能。在日常使用GitLab的过程中,我们常常需要使用一系列命令来管理代码仓库、处理分支和标签等。以下是GitLab常用的Git命令大全,并附上详细解释...

Python 幕后:Python导入import的工作原理

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)Python 最容易被误解的方面其中之一是import。Python 导入系统不仅看起来很复杂。因此,即使文档非常好,它也不能让您全面了解正在发生的事情。唯一方法是研究 Python 执行 import 语句时幕后发生的事情。注意:在这篇文...

摄影后期必看 | PS插件camera raw 16.4教程 | 范围蒙版

范围蒙版Camera Raw 【蒙版】模块中提供了三个范围蒙版工具,可以通过特定的范围来创建蒙版。此次新增的【范围蒙版】大大加强了acr插件对局部调整的能力。点击下拉小箭头可以看到【颜色范围】,可用于快速选择想要编辑的颜色。快捷键:Shift + C【明亮度范围】,可用于快速选择想要调整的明亮度。快...

html5迁移到微信小程序的 方法 亲测可用

切图网习惯于在做小程序之前先做成html5+vuejs的形式,因为html5切图是我们比较熟悉的方式,而且有专业的工具 以及浏览器调试也会更加的方便 灵活,效率高,而且html5的方式可以方便预览看效果,方便调整,当html5页面做好确认没问题以后 再转成小程序或者官方出品wepy的方式,这个时候就...

尤雨溪:Vue 2生命周期已正式结束,开发团队应迁移至最新版本

IT之家 1 月 2 日消息,Vue.js 作者尤雨溪发文声称,Vue 2 已于 2023 年 12 月 31 日结束生命周期(EOL),目前 Vue 2 已经无法接收到新功能及修复补丁,还在使用 Vue 2 的开发团队应迁移至最新的 Vue 3 版本。据悉,Vue 2.0 最初发布于 2016 年...