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

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

ruisui885个月前 (01-14)技术分析26

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 同步:程序员必备的核心知识,理解这两者差异,你就是高手” 的相关文章

Lindroid开源应用:在安卓手机 / 平板上安装 Linux发行版

IT之家 6 月 19 日消息,Erfan Abdi 本月发布了 Lindroid 开源应用程序,让用户可以在安卓手机上安装 GNU / Linux 发行版,在完全支持手机硬件的情况下可以运行 Linux 应用程序。Lindroid 开源应用程序就是将 Linux 放入容器中,使用 Halium 等...

vue3中父子组件之间传值的详解

首先我们回顾一下vue2中父子组件是怎么传值的,然后对比vue3进行详解。一、vue2中父子组件传值<!-- 父组件 --> <template> <div> // name:父组件把值传给子组件test-child // childFn:...

GitLab-合并请求

描述合并请求可用于在您对项目进行的其他人员之间交换代码,并轻松与他们讨论更改。合并请求的步骤步骤1-在创建新的合并请求之前,GitLab中应该有一个创建的分支。您可以参考本章来创建分支-步骤2-登录到您的GitLab帐户,然后转到“ 项目”部分下的项目 -步骤3-单击“ 合并请求”选项卡,然后单击“...

编码 10000 个小时后,开发者悟了:“不要急于发布!”

【CSDN 编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理:慢即是快,重视架构设计和代码质量,确保每一行代码都经得起时间的考验。作者 | Sotiris Ko...

el-table内容\n换行解决办法

问题请求到的数据带有换行符 '\n'但页面展示时不换行statusRemark: "\"1、按期完成计划且准确率100%,得100分;\n2、各项目每延误1天,扣1分;每失误1次或者员工投诉1次,扣3分,失误层面达到公司级影响较大的,该项绩效分数为0\"\n&...

学前端,这30个CSS选择器,你必须熟记

你学会了基本的id,class类选择器和descendant后代选择器,然后就觉得完事了吗?如果这样,你就会错过许多灵活运用CSS的机会。虽然本文提到的许多选择器都属于CSS3,并且只能在现代的浏览器中使用,但学会这些是大有好处的。什么是CSS选择器呢?每一条css样式定义由两部分组成,形式如下:[...