深入理解同步与异步编程及协程管理在Python中的应用
文章目录
- 1. 同步与异步函数的对比
- 1.1 同步函数
- 1.2 异步函数
- 1.3 对比
- 2. 管理多个协程与异常处理
- 2.1 并发执行多个协程
- 2.2 错误处理
- 2.3 任务取消
本文将探索Python中同步与异步编程的基本概念及其区别。还会详细介绍如何使用asyncio库来有效管理协程,包括任务的创建、错误处理和取消等功能。
1. 同步与异步函数的对比
1.1 同步函数
在同步模式下,如果some_function()进行耗时的I/O操作,比如网络请求或文件读取,程序将在此函数执行期间停止执行,直到操作完成。
def fetch_data():data = some_sync_function() # 耗时操作return data# 同步调用
data = fetch_data()
这种模式下,程序完全阻塞直到some_sync_function()执行完成。
1.2 异步函数
使用async和await创建的异步函数可以在执行中暂停并继续执行,无需阻塞程序:
async def fetch_data():data = await some_async_function() # 异步操作return data
在这种模式下,await关键字使得fetch_data在some_async_function()执行期间暂停,将控制权交还给事件循环,允许执行其他操作。
1.3 对比
| 特性 | 同步编程 | 异步编程 |
|---|---|---|
| 执行方式 | 阻塞式执行 | 非阻塞式执行 |
| 资源利用 | 效率较低,CPU等待I/O | 高效,CPU可以处理其他任务 |
| 复杂性 | 相对简单 | 较复杂,需要理解事件循环 |
| 适用场景 | 简单脚本、小工具 | I/O密集型应用,如Web服务器 |
| 控制流 | 线性,易于理解 | 需要使用回调、promises等 |
| 库/框架 | 无特殊需求 | 需要支持异步的库(如asyncio) |
| 性能 | 受限于I/O等待时间 | 可大幅提高响应速度和吞吐率 |
| 错误处理 | 直接处理 | 需要特殊机制处理异常 |
同步和异步的对比图

2. 管理多个协程与异常处理
在使用asyncio进行并发编程时,不仅需要管理多个协程的并发执行,同时也需要妥善处理可能出现的错误和取消正在运行的任务。
2.1 并发执行多个协程
asyncio.gather是一个非常实用的函数,它允许同时启动多个协程,并等待所有协程执行完成。这样可以有效地利用时间,因为它允许多个协程并行执行而非顺序执行。
import asyncioasync def count():print("One", end=' ') # 确保在打印后不自动换行await asyncio.sleep(1)print("Two", end=' ') # 同样不换行async def main():await asyncio.gather(count(), count(), count())asyncio.run(main())
# 输出:One One One Two Two Two
count协程会先打印“One”,然后等待1秒,接着打印“Two”。由于使用了asyncio.gather,三个count协程会并行执行,因此总的等待时间仅为1秒,而不是三次各自等待1秒。
加餐:end是干嘛用的
默认情况下,print函数会在每次调用后添加一个换行符,但如果设置end参数为一个空字符串'',那么输出将不会在末尾添加换行符。
2.2 错误处理
在asyncio中处理错误是确保程序健壮性和响应性的关键。错误处理通常通过使用try-except块来实现,这允许程序在遇到预期内的异常时优雅地恢复。
import asyncioasync def error_task():raise ValueError("Something went wrong!")async def main():task = asyncio.create_task(error_task())try:await taskexcept ValueError as e:print(f"Caught an error: {e}")asyncio.run(main())
# 输出:Caught an error: Something went wrong!
在这个例子中,error_task协程故意抛出一个ValueError异常。在main函数中,使用try-except块来捕获并处理这个异常。这样的错误处理机制确保了即使在异步任务失败时,程序也能继续运行,从而提高了整体的容错性。
asyncio.create_task 简介
asyncio.create_task()函数用于并行运行协程。此函数将协程封装成一个Task对象,并安排其在事件循环中执行。
2.3 任务取消
在asyncio中,取消任务是异步编程中的另一个重要方面,它允许开发者在任务不再需要时终止执行,从而释放资源。
import asyncioasync def cancellable_task():try:print("Task starts")await asyncio.sleep(10) # 假设这是一个长时间运行的任务print("Task completed")except asyncio.CancelledError:print("Task was cancelled!")async def main():task = asyncio.create_task(cancellable_task())await asyncio.sleep(1) # 给任务一点时间开始执行task.cancel() # 取消任务try:await taskexcept asyncio.CancelledError:print("Caught cancellation in main")asyncio.run(main())
# 输出:
# Task starts
# Task was cancelled!
# Caught cancellation in main
在这个例子中,cancellable_task开始执行后,通过调用task.cancel()来请求取消任务。任务中的asyncio.sleep调用会在收到取消请求时抛出一个asyncio.CancelledError。在任务的try-except块中捕获这个异常,可以执行任何必要的清理工作。在main函数中,等待任务完成,并处理可能由任务取消引发的异常。
参考:Synchronous vs Asynchronous Programming: Models, Differences, Use Cases
推荐: python 错误记录
相关文章:
深入理解同步与异步编程及协程管理在Python中的应用
文章目录 1. 同步与异步函数的对比1.1 同步函数1.2 异步函数1.3 对比 2. 管理多个协程与异常处理2.1 并发执行多个协程2.2 错误处理2.3 任务取消 本文将探索Python中同步与异步编程的基本概念及其区别。还会详细介绍如何使用asyncio库来有效管理协程,包括任务的创建…...
Win10本地更新无法升级win11 的0x80080005解决方法
Win10本地更新无法升级win11 Visual Studio 2022 运行项目时,本文提供了错误“指定的程序需要较新版本的 Windows”的解决方法。 更新时提示:0x80080005 解决方法 1、下载Windows11InstallationAssistant.exe 【免费】Windows11InstallationAssista…...
互联网轻量级框架整合之MyBatis核心组件
在看本篇内容之前,最好先理解一下Hibernate和MyBatis的本质区别,这篇Hibernate和MyBatis使用对比实例做了实际的代码级对比,而MyBatis作为更适合互联网产品的持久层首选必定有必然的原因 MyBatis核心组件 MyBatis能够成为数据持久层首选框&a…...
springboot websocket 持续打印 pod 日志
springboot 整合 websocket 和 连接 k8s 集群的方式参考历史 Java 专栏文章 修改前端页面 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Java后端WebSocket的Tomcat实现</title><script type"text/javasc…...
C代码编译过程与进程内存分布
C代码编译过程 在这篇文章中,我们将探讨C语言代码的编译流程以及进程在运行时的内存布局。编译过程通常包括几个关键步骤:预处理、编译、汇编和链接。 预处理阶段主要是处理源代码文件中的宏定义、头文件包含和条件编译指令。在此阶段,编译…...
Windows 部署ChatGLM3大语言模型
一、环境要求 硬件 内存:> 16GB 显存: > 13GB(4080 16GB) 硬盘:60G 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本,以获得最佳的推理性能 二、部…...
JS相关八股之什么是事件循环
在JavaScript中,“事件循环”(Event Loop)是一个非常重要的概念,它是指JavaScript引擎如何在单线程中处理异步操作的机制。单线程意味着在任意时刻,JavaScript代码只能执行一个任务。 一.事件循环的工作流程大致如下&…...
SpringCloud集成Skywalking链路追踪和日志收集
1. 下载Agents https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 2. 上传到服务器解压 在Spring Cloud项目中,每部署一个服务时,就拷贝一份skywalking的agent文件到该服务器上并解压。不管是部署…...
HTTP 域名和主机是一回事吗?有了主机和域名,如何建站?
域名不等于主机名,例如baidu.com是一个权威域的域名,但是根本没有一个主机的名字叫做baidu.com,但是dns.baidu.com就是一个主机名,它就是负责baidu.com的服务器的主机名,www.baidu.com也是一个主机名,它是百度web服务器的主机名。…...
运营干货:四个技巧掌握爆款选题方法
在运营工作中,选题是一项至关重要的工作,选对了一个热门话题,就能吸引大量用户的关注和互动,从而取得更好的运营成果。 今天,就给大家分享四个爆款选题方法,让大家的运营更上一层楼! 第一种&a…...
柯桥商务口语之怎么样说英语更加礼貌?十个礼貌用语get起来!
当你在国外需要帮助的时候,这些礼貌用语真的是能够帮到你的哦 1.Would/Could you help me? 你可帮助我吗? 相信有些人想请求帮助的时候,一开口就用Can you,这个用在朋友或者熟人上面当然是没有问题的,但是如果是向…...
嵌入式工程师如何摸鱼?
有老铁问我,做嵌入式开发要加班吗? 也不知道搞什么鬼,现在的年轻人对加班这么抵触。 我刚做开发那会,啥也不懂,每天基本都要加班到晚上7-9点不等,我并不抵触加班,因为早早回家,也没什…...
C++语言题库(一)—— 基本知识类
目录 1. Hello World! 2. 据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少? 3. 给定一个华氏温度F…...
gemini1.5 API调用
https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…...
C++从入门到精通——const与取地址重载
const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…...
手写spring IOC底层源码来模拟spring如何利用多级缓存解决循环依赖的问题
在文章开始之前,先来看一张spring IOC加载过程的脑图吧 Spring IOC的加载过程 首先,当我们去new了一个applicationContext,它底层呢就会把我们配置的bean进行扫描,然后创建成一个一个的beanDefinition放在我们的beanDefinitionMap中,此时就有了一切创造bean的原料信…...
C++11 Thead线程和线程池
参考资料: 2、5.lock_guard 与 std::unique_lock-陈子青的编程学习课堂 (seestudy.cn) 3、C11 多线程编程-小白零基础到手撕线程池_哔哩哔哩_bilibili 一、 C11 Thead线程库的基本使用 # include <thread> std::thread t(function_name, args...); // 线…...
Windows版Apache 2.4.59解压直用(免安装-绿色-项目打包直接使用)
windows下Apache分类 Apache分为 安装版和解压版 安装版: 安装方便,下一步------下一步就OK了,但重装系统更换环境又要重新来一遍,会特别麻烦 解压版(推荐): 这种方式(项目打包特别方便&#x…...
刀具表面上的微结构
刀具表面微结构通常指在刀具表面对特定功能设计的微观纹理,这些纹理可以是沟槽、凹坑、凸起或任何其他形式的微观图案。这些微结构的设计和应用是为了改善刀具的切削性能,减少切削力和切削温度,提高切削效率和精度,同时降低切削液…...
css3实现微信扫码登陆动画
在做微信扫码登陆时,出现一个背景光图上下扫码动画,用css3图片实现。 实现原理: 1.准备一个渐变的背景.png图 2.css动画帧实现动画 看效果: css代码: #wx-scan{position: absolute;top:0px;left: 50%;z-index: 3;ma…...
目前专业的LED数码管屏厂商哪家好
在现代显示技术领域,LED数码管屏因其高亮度、低功耗和长寿命等特点,广泛应用于各种电子设备中。选择一家专业的LED数码管屏厂商至关重要。本文将为您推荐几家市场上表现突出的厂商,并进行详细对比。1. 杭州斡能电子有限公司公司简介ÿ…...
5个高效能技巧:人工智能术语库全场景应用从入门到精通
5个高效能技巧:人工智能术语库全场景应用从入门到精通 【免费下载链接】Artificial-Intelligence-Terminology-Database 这个仓库包含一个关于人工智能术语的数据库。适合AI研究者、学生以及希望了解AI专业术语的人士。特点是包含大量AI相关词汇,有助于理…...
HP-Socket技术债务管理会议决策记录:选项、理由与结果
HP-Socket技术债务管理会议决策记录:选项、理由与结果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket 作为一款高性能TCP/UDP/HTTP通信组件库,HP-So…...
OpenClaw对接Qwen3-32B-Chat私有镜像:RTX4090D本地部署全流程
OpenClaw对接Qwen3-32B-Chat私有镜像:RTX4090D本地部署全流程 1. 为什么选择本地私有化部署? 去年冬天,当我第一次尝试用OpenClaw自动化处理周报时,发现公有云API的响应延迟和隐私顾虑成了瓶颈。直到在星图镜像广场发现Qwen3-32…...
YOLOv11涨点改进| 全网独家创新、检测头Head改进篇| CVPR 2026顶会 |使用FAAHead改进YOLOv11的检测头,处理小目标、遮挡小目标检测、旋转目标检测有效涨点,助力高效发论文
一、本文介绍 🔥本文给大家介绍使用CVPR 2026顶会 FAAHead 和 OBB_FAAHead 改进 YOLOv11的检测头,可以有效缓解目标检测中分类分支与框回归分支之间的特征冲突问题,尤其适合旋转目标检测或含明显方向信息的目标检测任务。FAAHead 的核心思想是在检测头阶段先对 RoI 或候选…...
为什么流水线ADC能用Dither,而SAR ADC效果差?深入解析两种架构下的Dither技术差异与改进方案
流水线ADC与SAR ADC中Dither技术的差异化设计与工程实践 在高速高精度数据采集系统中,量化噪声的非线性特性始终是困扰设计者的核心难题。当我们用频谱分析仪观察一个理想正弦波经过ADC转换后的输出时,那些突兀的谐波分量往往源自量化过程的非线性失真。…...
梦幻动漫魔法工坊:5分钟零基础搭建,小白也能生成专属二次元头像
梦幻动漫魔法工坊:5分钟零基础搭建,小白也能生成专属二次元头像 想不想拥有一个独一无二的二次元头像,却苦于不会画画?或者想为你的游戏角色、小说人物创造一个生动的形象,却找不到合适的画师?今天&#x…...
从Go协程到Java 21虚拟线程:一个Gopher的迁移避坑指南与性能对比
从Go协程到Java 21虚拟线程:一个Gopher的迁移避坑指南与性能对比 作为一名长期深耕Go语言生态的开发者,第一次接触Java 21的虚拟线程时,那种熟悉又陌生的感觉令人印象深刻。Go的goroutine以其轻量和高效著称,而Java平台线程的笨重…...
Qwen3-TTS在心理治疗中的应用:情感化语音陪伴系统
Qwen3-TTS在心理治疗中的应用:情感化语音陪伴系统 1. 引言 想象一下这样的场景:一位正在经历焦虑情绪的用户,深夜无法入睡,需要即时的情感支持。传统的心理咨询需要预约等待,而此刻他们最需要的是一个能够理解、回应…...
嵌入式开发实战:用状态机+事件驱动框架搞定串口通信(附完整代码)
嵌入式开发实战:状态机与事件驱动框架在串口通信中的高效应用 串口通信作为嵌入式系统中最基础也最常用的外设接口之一,其稳定性和效率直接影响着整个系统的性能表现。传统的轮询式串口处理方式不仅占用大量CPU资源,还难以应对复杂通信协议和…...
