百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python中同步&异步编程原来是这样!附代码案例

haoteby 2025-05-26 15:53 6 浏览

有人问,Python中所谓的同步异步编程到底是什么呀?

同步异步其实很好理解,比如你去某站下载视频,有两种情况,分别代表同步和异步。

1、点击下载视频A,等A下载好后,再点击下载视频B,以此类推下载所有视频。

2、点击下载视频A,不管是否下载好,然后立即点击下载视频B,各下载任务同时进行中,以此类推下载所有视频。

第1种是同步,是排队执行,只有前一个任务完成后才执行后一个任务。

第2种是异步,边干边等,利用等待时间去处理其他任务,可以多个任务灵活并行。

如果不考虑网速带宽,第1种效率很明显会低于第2种。

下面咱们用Python代码测试下,首先是同步执行下载任务。

# 测试:使用同步代码
import time

def dowload(name):
    print(f"{name}开始下载")
    time.sleep(2)  # 模拟视频下载耗时
    print(f"{name}下载完成")

begin = time.time()
dowload("视频A")  # 必须等A下载完...
dowload("视频B")  # ...才会开始下载视频B
end = time.time()
print("用时{}秒".format(end - begin))

结果如下,用时4秒+。

因为同步会阻塞,视频A下载好了才开始下载视频B。

接下来使用异步编程来实现同样的任务。

这里注意下,Python中使用异步编程,需要async/await特殊语法。

# 测试:使用异步代码
import asyncio
import time

asyncdef dowload(name):
    print(f"{name}开始下载")
    await asyncio.sleep(2)  # 非阻塞等待
    print(f"{name}下载完成")

asyncdef main():
    await asyncio.gather(
        dowload("视频A"),
        dowload("视频B")
    )

begin = time.time()
asyncio.run(main())
end = time.time()
print("用时{}秒".format(end - begin))

结果如下,只用了2秒+。

异步不用等待A下载完成,直接下载B,两个同时进行,不存在等待阻塞。

这下就很好理解同步和异步的原理和区别了,同步是排队干活,异步并不是同时干很多活,而是灵活的分配精力在多个任务上,不因为等待而耗费时间。

那同步和异步的使用场景有哪些呢?

同步适合那些严格依赖执行顺序的任务,比如订单任务(下单->发货)、转账任务(扣款->入账)等,还有CPU计算密集型任务,像是数学计算、图像处理等。

异步则适合那些IO操作密集型和高并发的任务,比如给用户发消息、web网页请求、文件读写、文件下载和上传等,这些任务的特点是需要等待时间,异步能提高任务执行效率。

所以说同步异步适合不同的业务场景,并不存在好坏对错之分。

下表是一些场景和案例对比,供参考。

相关推荐

R数据分析:双因素方差分析与交互作用检验

Two-wayANOVAtestisusedtoevaluatesimultaneouslytheeffectoftwogroupingvariables(AandB)...

R数据分析:用R语言做meta分析

这里以我的一篇meta分析为例,详细描述meta分析的一般步骤,该例子实现的是效应量β的合并...

生存分析看完这篇就够了(R语言代码+线上工具)

尔云间一个专门做科研的团队云生信学生物信息学关注我们...

用R语言画图

R语言中离群值的识别、描述、绘制与移除

摘要:统计学中离群值被定义为离开大部分观测较远的样本点,多数是由于测量误差而产生。因此,数据分析中离群值的识别和移除(如有必要)是很重要的一个步骤。鉴定离群值的方法有很多种,包括基于标准差的方法和基于...

R语言、RStudio的下载、安装与使用

本文介绍R语言及其集成开发环境...

[R语言] R语言快速入门教程

本文主要是为了从零开始学习和理解R语言,简要介绍了该语言的最重要部分,以快速入门。主要参考文章:R-TutorialR语言程序的编写需要安装R或RStudio,通常是在RStudio中键入代码。但是R...

看完这个「R语言课程」合集,我发现R语言也不过如此…

小料君看到一个有趣的问答...

在R语言中使用正则表达式

有时候我们要处理的是非结构化的数据,例如网页或是电邮资料,那么就需要用R来抓取所需的字符串,整理为进一步处理的数据形式。R语言中有一整套可以用来处理字符的函数,在之前的博文中已经有所涉及。但真正的...

附代码|详解R语言的高级数据结构

有时数据需要比向量更复杂的存储方式。幸运的是,R软件提供了很多的数据结构。常见的有数据框(data.frame)、矩阵(matrix)、列表(list)以及数组(array)。数据框类似于电子表格,矩...

R语言实战—自学笔记—向量

第2章创建数据集2.1数据集的概念数据集:由数据构成的一个矩形数组,行表示观测,列表示变量。...

R语言从入门到精通:Day7

原创小浣熊科研猫是时候关注我们一波了在向reviewer或者导师展示自己的统计分析结果时,一张图往往顶得上千言万语;在刚接触到数据时,图也能帮助我们发现数据中潜在的模式或者其中的异常值,这两个例子...

一文教你学会维恩图的绘制——R语言

背景介绍维恩图用于展示在不同的事物群组(集合)之间的数学或逻辑联系,尤其适合用来表示集合(或)类之间的“大致关系”,它也常常被用来帮助推导(或理解推导过程)关于集合运算(或类运算)的一些规律。通常每个...

R语言介绍

一、R语言介绍...

R语言的一些常见初级基本操作

基本概念:在R语言里操作和接触的所有东西都称作对象(object)。对象有很多种类可以包含各种类型的数据。R语言里所有的东西都被称为对象,R语言中常见的数据类型有几下几种,分别是字符型(cha...