Python中的异步编程:从基础知识到高级应用

在这里插入图片描述

随着互联网应用的不断发展,高并发和高性能成为越来越多开发者关注的重点。Python 3.5引入了asyncio库和async/await语法,使得异步编程变得更加简洁和高效。本文将详细介绍Python中的异步编程,从基础知识到高级应用,帮助你掌握这一重要的编程范式。

什么是异步编程?

异步编程是一种编程方式,它允许程序在等待某个长时间操作(如I/O操作、网络请求等)时,不阻塞主线程,而是继续执行其他任务。这种方式可以显著提高程序的并发能力和响应速度。

Python中的异步编程基础
协程(Coroutine)

协程是异步编程的核心概念。在Python中,协程是使用async def定义的函数,它返回一个coroutine对象。协程可以在执行过程中暂停和恢复,这使得它非常适合处理异步操作。

import asyncioasync def say_hello():print("Hello")await asyncio.sleep(1)  # 模拟异步操作print("World")# 运行协程
asyncio.run(say_hello())

在这个例子中,say_hello是一个协程函数,await asyncio.sleep(1)模拟了一个异步操作。asyncio.run用于启动协程。

事件循环(Event Loop)

事件循环是异步编程的核心组件,它负责管理和调度协程的执行。asyncio库提供了一个事件循环,可以使用asyncio.get_event_loop()获取当前的事件循环。

import asyncioasync def say_hello():print("Hello")await asyncio.sleep(1)print("World")# 获取事件循环
loop = asyncio.get_event_loop()# 运行协程
loop.run_until_complete(say_hello())# 关闭事件循环
loop.close()
任务(Task)

任务是异步操作的包装器,它允许你对协程进行更细粒度的控制。你可以使用asyncio.create_task来创建任务,并将其添加到事件循环中。

import asyncioasync def say_hello():print("Hello")await asyncio.sleep(1)print("World")# 获取事件循环
loop = asyncio.get_event_loop()# 创建任务
task = loop.create_task(say_hello())# 运行任务
loop.run_until_complete(task)# 关闭事件循环
loop.close()
并发执行多个协程

使用asyncio.gather可以并发执行多个协程,并等待所有协程完成。

import asyncioasync def say_hello(name):print(f"Hello, {name}")await asyncio.sleep(1)print(f"Goodbye, {name}")async def main():tasks = [say_hello("Alice"),say_hello("Bob"),say_hello("Charlie")]await asyncio.gather(*tasks)# 运行主协程
asyncio.run(main())

在这个例子中,asyncio.gather并发执行了三个say_hello协程,并等待所有协程完成。

异步I/O操作

asyncio库提供了许多异步I/O操作的工具,如异步文件读写、网络请求等。下面是一个使用aiohttp库进行异步HTTP请求的示例:

import asyncio
import aiohttpasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():urls = ['https://api.github.com','https://api.twitter.com','https://api.facebook.com']async with aiohttp.ClientSession() as session:tasks = [fetch(session, url) for url in urls]results = await asyncio.gather(*tasks)for result in results:print(result[:100])  # 打印每个响应的前100个字符# 运行主协程
asyncio.run(main())

在这个例子中,我们使用aiohttp库并发地发送多个HTTP请求,并等待所有请求完成。

错误处理

在异步编程中,错误处理非常重要。你可以使用try-except块来捕获和处理协程中的异常。

import asyncioasync def risky_operation():await asyncio.sleep(1)raise ValueError("Something went wrong")async def main():try:await risky_operation()except ValueError as e:print(f"Caught an exception: {e}")# 运行主协程
asyncio.run(main())
高级应用:异步上下文管理器

异步上下文管理器允许你在异步代码中使用async with语句,从而更好地管理资源。

import asyncioclass AsyncContextManager:async def __aenter__(self):print("Entering context")return selfasync def __aexit__(self, exc_type, exc, tb):print("Exiting context")async def main():async with AsyncContextManager() as manager:print("Inside context")# 运行主协程
asyncio.run(main())

在这个例子中,AsyncContextManager类实现了__aenter____aexit__方法,允许它作为异步上下文管理器使用。

结语

异步编程是现代Python开发中的一个重要工具,它可以帮助你编写高性能、高并发的应用程序。通过理解和掌握协程、事件循环、任务和异步I/O操作,你可以在各种场景中充分利用Python的异步特性。希望本文能为你提供足够的启发,让你在实际开发中更加得心应手。

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

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

相关文章

【AI大模型】LLM主流开源大模型介绍

目录 🍔 LLM主流大模型类别 🍔 ChatGLM-6B模型 2.1 训练目标 2.2 模型结构 2.3 模型配置(6B) 2.4 硬件要求 2.5 模型特点 2.6 衍生应用 🍔 LLaMA模型 3.1 训练目标 3.2 模型结构 3.3 模型配置(7B) 3.4 硬件…

ROS第四梯:ROS项目中添加自定义类

第一步,ROS项目结构介绍 工作空间中包含一个名为pcl_ros_test的功能包,其中main.cpp是原有项目自带的,接下来以CommonAlg自定义类添加为例进行介绍。 第二步:头文件CommonAlg.h创建和编写,并保存在include/pcl_ros_tes…

springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结

源码地址:下载地址 使用该架构的项目地址:下载地址 下面教大家整合nacos、sentinal、springcloud-gateway,springboot security、oauth2做一个分布式架构 1、第一步整合nacos 1、下载alibaba的nacos 下载地址,然后使用单机模式启动nacos sh startup.sh -m standalon…

828华为云征文 | 云服务器Flexus X实例,搭建上线前后端项目

828华为云征文 | 云服务器Flexus X实例,搭建上线前后端项目 项目搭建 演示使用华为云服务器Flexus X实例搭建上线前后端项目黑马vue电商后台管理系统 项目GitHub链接:https://github.com/Minori-ty/vue_shop.git 1、购买华为云 Flexus X 实例 Flexus云服…

搜索小车运动最短路径python代码实现

一、实验任务 场地中正方格代表障碍物,选取小车运动起点和终点。编程探究小车从起点运动到终点,总共有几种可行的路径(路径不含重叠部分),同时找出最短路径并可视化。 二、实验思路 把场地抽象化为69的平面矩阵&…

基于Linux系统离线安装oracle数据库

注意事项: 在安装的时候多次涉及root用户和oracle用户的切换,请注意区分,本文已明显 一、环境准备 1、关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld2、 禁用NetworkManager服务(非必须) [rootlocalhost …

4 路 4-20mA 电流/0-10V 电压转光纤

型号:MS-F155-AM 功能概述 MS-F155-AM 是将 4-20mA 电流转为光纤信号的模块,分发送和接收两个设备。发送模块将电流或者电压信号转变为光信号,通过光纤传输,接收端将光信号还原为电流或者电压信号。可以延长通信距离,最…

从零开始讲DDR(1)——DDR简介

一、DDR简介 DDR SDRAM(Double Data Rate Synchronous DYNAMIC RAM)中文名是:双倍数据速率同步动态随机存储器。 传统的SDRAM只在时钟信号的上升沿传输数据,而DDR可以同时在时钟的上升沿和下降沿传输数据,因此在同样的…

零信任安全架构--持续验证

随着网络安全威胁的不断演变,传统的“信任但验证”安全模式已无法应对现代复杂的攻击。零信任安全架构(Zero Trust Architecture, ZTA)应运而生,作为一种全新的安全理念,它彻底改变了企业的网络安全防护方式。核心思想…

windows查找端口号被占用

在很多开发的时候,可能端口号有被占用的情况,导致项目打不开。 用下面这个命令即可: 比如我的3000端口被占用,我找找哪个进程在占用我的3000端口号

JAVA惊喜连连无限可能沉浸式盲盒商城系统小程序源码

🎁惊喜连连,无限可能!沉浸式盲盒商城系统,等你来探索🔍 🎉【开篇:盲盒热潮,席卷而来】🎉 在这个充满未知与惊喜的时代,盲盒文化正以前所未有的速度席卷全球…

Vue学习记录之五(组件/生命周期)

一、组件 在每一个.vue文件可以看作是一个组件,组件是可以复用的,每个应用可以看作是一棵嵌套的组件树。 在Vue3中,组件导入以后即可直接使用。 二、组件的生命周期 生命周期就是从诞生(创建)到死亡(销毁) 的过程。 Vue3 组合式API中(se…

Rocky 8.7 操作系统 安装部署 MySQL 5.7.32 验证测试

一、安装部署 主从服务器都需提前安装部署MySQL 5.7.32 数据库软件,本次选择采用二进制安装。 配置主从,要注意调整主备库server_id不能保持一致。 主库修改/etc/my.cnf文件,添加 server-id1log-binmysql-binbinlog-do-dbmsdbbinlog-ign…

java se 快速入门

文章目录 java se 快速入门Java 简介Java的优点jdk 和 jre安装jdk配置环境变量Java 语法快速入门程序入口文件名类规范 基本语法注释变量和常量输入输出条件语句循环语句 基本数据类型Java字符串常用方法字符串拼接java字节数组和字符串相互转化java字符数组和字符串相互转换ja…

传输层协议 —— TCP协议(上篇)

目录 1.认识TCP 2.TCP协议段格式 3.可靠性保证的机制 确认应答机制 超时重传机制 连接管理机制 三次握手 四次挥手 1.认识TCP 在网络通信模型中,传输层有两个经典的协议,分别是UDP协议和TCP协议。其中TCP协议全称为传输控制协议(Tra…

torch.embedding 报错 IndexError: index out of range in self

文章目录 1. 报错2. 原因3. 解决方法 1. 报错 torch.embedding 报错: IndexError: index out of range in self2. 原因 首先看下正常情况: import torch import torch.nn.functional as Finputs torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) embedd…

游戏如何检测加速外挂

在游戏面临的众多外挂风险中,除了常见的内存修改挂、注入挂等作弊手段,黑灰产还常用「加速」手段实现作弊。 游戏安全风险分布占比图 「加速」顾名思义是指改变游戏内的速度。游戏在运行中需要以帧为单位播放画面,而计算每帧动画播放所需时间…

代码随想录算法训练营第3天|链表理论基础、203. 移除链表元素、 707.设计链表、 206.反转链表

目录 链表理论基础203. 移除链表元素1、题目描述2、思路3、code4、复杂度分析 707. 设计链表1、题目描述2、思路3、code 206. 反转链表1、题目描述2、思路3、code4、复杂度分析 链表理论基础 ❤️链表增删的时间复杂度都是 O ( 1 ) O(1) O(1),适合动态增删&#xf…

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)

本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻!!! 整数在内存中的存储 回忆知识:在讲操作符的那章节中,对于整数而言咱们讲过原码,反码和补码。整数分为有…