同步和异步——简单的Demo

news2024/11/25 15:30:28

一、程序中的同步和异步的区别

在编程中,同步和异步是指代码执行的方式和顺序。

1. 同步(Synchronous): 同步代码按照顺序依次执行,每个操作必须等待前一个操作完成后才能执行。在同步模式下,代码会阻塞(block),即等待操作完成后再执行下一个操作。同步代码适用于简单的、独立的操作,但在面对耗时的操作或需要等待的情况下,同步代码可能会导致程序的阻塞和响应性问题。

2. 异步(Asynchronous): 异步代码不会阻塞,而是通过回调函数、事件驱动或者异步任务队列的方式来处理操作。在异步模式下,代码可以继续执行后续操作,而不必等待前一个操作完成。 异步代码适用于需要等待的操作,如网络请求、文件读写等,可以提高程序的并发性和响应性。

异步编程的优势在于可以同时处理多个任务,提高系统的性能和响应速度。而同步编程则简单直观,适用于简单的操作和顺序执行的场景。

Python中,可以使用协程、回调函数、多线程、多进程等方式实现异步编程。 常见的异步编程库包括asyncioaiohttpTornado等。这些库提供了异步操作的支持,可以帮助开发者编写高效的异步代码。

二、实例代码

以下是一个使用Python编写的同步和异步的简单示例:

2.1 同步示例:

import time

def task(name):
    print(f"Starting task {name}")
    time.sleep(2)  # 模拟耗时操作
    print(f"Completed task {name}")

def main():
    print("Start synchronous tasks")
    task("A")
    task("B")
    task("C")
    print("All tasks completed")

if __name__ == "__main__":
    main()

在这个示例中,task函数模拟了一个耗时的操作,每个任务需要等待2秒钟。main函数按顺序调用了三个任务,并等待它们完成后才输出"All tasks completed"。这是一个典型的同步代码,每个任务都会阻塞主线程,直到完成。

2.2 异步示例:

import asyncio

async def task(name):
    print(f"Starting task {name}")
    await asyncio.sleep(2)  # 模拟耗时操作
    print(f"Completed task {name}")

async def main():
    print("Start asynchronous tasks")
    await asyncio.gather(
        task("A"),
        task("B"),
        task("C")
    )
    print("All tasks completed")

if __name__ == "__main__":
    asyncio.run(main())

在这个示例中,task函数被定义为一个异步函数,使用asyncio.sleep模拟了一个耗时的操作。main函数被定义为一个异步函数,并使用await asyncio.gather同时启动了三个任务。这些任务将并发执行,不会阻塞主线程。通过asyncio.run运行main函数,程序会等待所有任务完成后输出"All tasks completed"
🎈关键字解释:
在Python中,使用async关键字来定义一个异步函数。将async放在函数定义前面,表示该函数是一个异步函数。

异步函数使用await关键字来等待一个耗时的操作完成,而不会阻塞当前线程。在异步函数内部,可以使用await来等待其他异步函数、协程、Future对象等。

在异步函数中,可以使用asyncio库提供的异步操作函数(如asyncio.sleep)来模拟耗时操作,或者调用其他支持异步操作的库函数。

异步函数可以通过asyncio.run来运行,也可以作为其他异步函数或协程的一部分被调用。

总结起来,使用async关键字来定义函数表示该函数是一个异步函数,可以在函数内部使用await关键字来等待其他异步操作的完成。异步函数能够提供并发性和响应性,以及更好的利用系统资源。

2.3 对比:

在这两个示例中,同步代码按照顺序执行,每个任务必须等待前一个任务完成后才能执行。而异步代码可以并发执行多个任务,不会阻塞主线程,提高了程序的并发性和响应性。

2.4 代码结果比较:

**运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署问题集合(十八)Windows环境下使用两个Tomcat

下载Tomcat Tomcat镜像下载地址:https://mirrors.cnnic.cn/apache/tomcat/进入如下地址:zip的是压缩版,exe是安装版 修改第二个Tomcat配置文件 第一步:编辑conf/server.xml文件,修改三个端口,有些版本改…

信号量SytemV与Posix信号量的介绍与用法

目录 1、信号量介绍 2、信号量SystemV介绍 2.1 信号量函数 2.2 信号量C代码实现 3、信号量Posix介绍 3.1 无名信号量 3.2 有名信号量 1、信号量介绍 信号量是一种计数器,用在多进程、多线程的共享资源访问控制上面,防止多进程、多线程对共享资源的…

win下tomcat部署问题积累

1、win下双击tomcat的start.bat出现闪退 检查环境变量是否配置正确: 1.在已解压的tomcat的bin文件夹下找到startup.bat,右击->编辑。在文件头加入下面两行: SET JAVA_HOMED:\Java\jdk1.6.0_10 (java jdk目录)S…

【C语言进阶】程序环境和预处理

🔥博客主页:小王又困了 📚系列专栏:C语言 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、程序的翻译环境和执行环境 二、详解编译和链接 2.1翻译环境 2.2编译的过…

Centos yum install出现Error: Unable to find a match: epel-release的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

MySQL基础扎实——MySQL中有哪几种锁

常见锁举例 在MySQL中,常见的锁包括以下几种: 表级锁(Table-level Lock):表级锁是对整张表进行锁定,可以分为两种类型: 共享锁(Shared Lock):也称为读锁&…

Google Earth Engine谷歌地球引擎提取多波段长期反射率数据后绘制折线图并导出为Excel

本文介绍在谷歌地球引擎GEE中,提取多年遥感影像多个不同波段的反射率数据,在GEE内绘制各波段的长时间序列走势曲线图,并将各波段的反射率数据与其对应的成像日期一起导出为.csv文件的方法。 本文是谷歌地球引擎(Google Earth Engi…

Python图像处理【13】使用PIL执行图像降噪

使用PIL执行图像降噪 0. 前言1. 均值滤波器1.1 均值滤波器原理1.2 使用均值滤波器去除椒盐噪声 2. 高斯滤波器2.1 高斯滤波器原理2.2 使用高斯模糊滤波器去除椒盐噪声 3. 中值滤波器3.1 中值滤波器原理3.2 使用中值滤波器去除椒盐噪声 小结系列链接 0. 前言 在本节中&#xff…

MAXENT模型的生物多样性教程

详情点击链接:基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化及未来气候变化下评估中的应用及论文写作 一:生物多样性保护格局与自然保护区格局优化 1.我国生物多样性格局与分布; 2.我国自然保护区格局与分布&…

Emacs之改造搜索文件fd-dired(基于fd命令)(一百二十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

【【51单片机AD转换模块】】

代码是简单的&#xff0c;板子是坏的&#xff0c;电阻是识别不出来的 main.c #include <REGX52.H> #include "delay.h" #include "LCD1602.h" #include "XPT2046.h"unsigned int ADValue;void main(void) {LCD_Init();LCD_ShowString(1,1…

format格式化输出语法详解

hello&#xff0c;这里是Token_w的文章&#xff0c;主要讲解python的基础学习&#xff0c;希望对大家有所帮助 整理不易&#xff0c;感觉还不错的可以点赞收藏评论支持&#xff0c;感谢&#xff01; 使用 % 操作符对各种类型的数据进行格式化输出&#xff0c;这是早期 Python提…

文档、视频、图片上传(点击、拖拽、批量导入)要‍‍‍‍怎么实现?!

文章目录 Excel上传和图片视频上传Excel上传页面中的使用图片和视频上传的错误提醒以及逻辑处理上传进度处理 Excel上传和图片视频上传 Excel上传 excel的上传其实分为两步&#xff1a; 1、下载excel模板 2、上传excel模板 在项目中涉及到excel的业务&#xff0c;基本上都…

Neo4j

存储结构 参考&#xff1a; 《图数据库&#xff08;第二版&#xff09;》 https://www.jianshu.com/p/94c1166eb400 https://blog.csdn.net/sinat_32336967/article/details/103348528 更新日期&#xff1a;2022-8-18 Neo4j版本&#xff1a;4.4 类型ID长度&#xff08;bit&…

使用Ensp配置DHCP协议

如何使用Ensp配置DHCP协议&#xff0c;为PC自动分配IP地址 什么是DHCP&#xff1f; Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff0c;简单理解为自动分配IP地址&#xff0c;有了这个协议就不用手动配置IP地址了&#xff0c;如图 思路 给路由…

Monkey日志分析

1. Monkey日志详解 Monkey日志由以下几部分组成&#xff1a; 测试命令信息 随机种子seed、运行次数、可运行应用列表、各事件百分比。 App切换和Activity跳转 可以看到切换到了哪个App&#xff0c;从哪个Activity跳转到了哪个Activity&#xff0c;如果发生了异常&#xff0c…

JVM详解(超详细)

目录 JVM 的简介 JVM 执行流程 JVM 运行时数据区 由五部分组成 JVM 的类加载机制 类加载的过程(五个) 双亲委派模型 类加载器 双亲委派模型的优点 JVM 中的垃圾回收策略 GC GC 中主要分成两个阶段 死亡对象的判断算法 引用计数算法 可达性分析算法 垃圾回收算…

Mac m1 下eclipse下载及jdk环境变量配置

一、安装eclipse 1、下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation 此版本为m1芯片适用版本 2、下载后下一步安装即可 安装成功后&#xff0c;可以看到图标&#xff1a; 二、安装jdk 1、下载jdk 下载此版本即可&#xff0c;下载完成之后一直…

Linux系统中的SQL语句

本节主要学习&#xff0c;SQL语句的语句类型&#xff0c;数据库操作&#xff0c;数据表操作&#xff0c;和数据操作等。 文章目录 一、SQL语句类型 DDL DML DCL DQL 二、数据库操作 1.查看 2.创建 默认字符集 指定字符集 3.进入 4.删除 5.更改 库名称 字符集 6…