Python 异步编程的秘密武器:Asyncio

server/2024/10/22 18:32:59/

python编程中,异步编程是一个重要概念。它允许我们在等待某些操作(如网络请求或文件读写)时,不阻塞程序的其他部分运行。

在 Python 中,asyncio 是实现异步编程的强大工具。今天,我们将一同探索 asyncio 的基本概念、工作原理,并通过一些有趣的案例来加深理解。

图片

什么是异步编程?

异步编程是一种编程范式,它允许程序在执行某些操作(如网络请求或文件读写)时,不会阻塞整个程序的运行。简单来说,当你在等某个任务完成时,你可以去做其他事情,而不是一味地等待。

阻塞与非阻塞

  • 阻塞:程序在执行某个操作时会停下来,直到操作完成。

  • 非阻塞:程序可以继续执行其他操作,而不必等待某个操作完成。

想象一下,在厨房里做饭,你可以同时煮水、切菜和准备食材,而不是一件一件地完成。

asyncio:Python的异步编程库

asyncio是Python内置的异步编程库,它使得编写异步代码变得简单而高效。通过使用asyncawait关键字,开发者可以轻松实现异步操作。

核心概念

  • 协程:使用async def定义的函数,能够在执行过程中被挂起,并在需要的时候恢复执行。

  • 事件循环asyncio的核心,负责调度和管理协程的执行。

  • 任务:协程的封装体,事件循环可以用来执行这些任务。

使用asyncio的基本步骤

1 创建协程

首先,我们定义一个简单的协程,它模拟一个耗时的操作:

import asyncioasync def say_hello():print("Hello")await asyncio.sleep(1)  # 模拟耗时操作print("World")

2 事件循环

接下来,我们需要创建一个事件循环来运行这个协程:

async def main():await say_hello()# 运行事件循环
asyncio.run(main())

实战案例:并发HTTP请求

我们可以使用asyncioaiohttp库来进行并发的HTTP请求。下面的代码展示了如何同时获取多个网页的内容。

1 安装aiohttp

首先,确保你已经安装了aiohttp库:

pip install aiohttp

2 实现并发请求

下面是一个获取多个网页内容的示例:

import asyncio
import aiohttpasync def fetch(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main(urls):tasks = [fetch(url) for url in urls]results = await asyncio.gather(*tasks)for result in results:print(f"Fetched {len(result)} characters")# 示例网址
urls = ['https://www.example.com','https://www.python.org','https://www.openai.com'
]# 运行事件循环
asyncio.run(main(urls))

3 解释代码

  • fetch协程:接收URL,使用aiohttp进行异步GET请求。

  • main协程:创建任务列表并使用asyncio.gather并发执行所有请求。

异步编程在现代Python开发中至关重要,asyncio库使得编写异步代码变得简单高效。通过理解协程、事件循环和任务的概念,你可以在自己的项目中利用异步编程提升性能。

 文末福利

最后,如果你对 Python 感兴趣,想要有更深入的了解,可以试试我整理的这一份全套的Python学习资料,【点击这里】免费领取!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。

也可以微信扫描下方CSDN官方认证二维码免费获取【保证100%免费】

 

① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习


http://www.ppmy.cn/server/122439.html

相关文章

响应式的几种解决方案——媒体查询、flex、grid、多列布局、瀑布流和数据可视化屏幕的缩放处理

media媒体查询 媒体查询入门指南 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

前端中CSS选择器权重的问题

前言 前端中很重要的CSS&#xff0c;使得网页更加丰满美丽&#xff0c;我们使用CSS时&#xff0c;必不可少的需要使用选择器&#xff0c;选择器也分为简单选择器和复合选择器。而在给选择器中填充内容时&#xff0c;有时候会有一些命令重复&#xff0c;会涉及到优先级的问题&a…

杭州算力小镇:AI泛化解锁新机遇,探寻AI Agent 迭代新路径

人工智能技术不断迭代&#xff0c;重点围绕着两个事情&#xff0c;一是数据&#xff0c;二是算力。 算法的迭代推动着AI朝向多模态的方向发展&#xff0c;使之能够灵活应对不同领域的不同任务&#xff0c;模型的任务执行能力大大提升&#xff0c;人工智能泛化能力被推上高潮。…

如何使用Flux+lora进行AI模型文字生成图片

目录 概要 前期准备 部署安装与运行 1. 部署ComfyUI 本篇的模型部署是在ComfyUI的基础上进行&#xff0c;如果没有部署过ComfyUI&#xff0c;请按照下面流程先进行部署&#xff0c;如已安装请跳过该步&#xff1a; &#xff08;1&#xff09;使用命令克隆 ComfyUI &…

【JAVA高级】 redis分布式双重加锁(业务校验:防止接口并发调用时数据重复)

文章目录 此问题的考虑思路使用Redis的key-value锁的基本思路结合Redis数据结构实现避免重复注意事项实现代码只避免 name和age的重复避免 name和age的和age和sex重复&#xff1a;使用双重的分布式锁实现&#xff1a; 背景&#xff1a;在日常开发过程中&#xff0c;遇到了一个需…

【高阶数据结构】二叉搜索树的插入、删除和查找(精美图解+完整代码)

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《高阶数据结构》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多《高阶数据结构》点击专栏链接查看&a…

haproxy程序崩溃问题处理

背景&#xff1a; 线上一k8s环境告警出节点失联&#xff0c;通过排查和k8s的api建立链接失败&#xff0c;检查发现haproxy出现了重启&#xff0c;对应的日志显示出程序运行崩溃&#xff0c;这个情况根据日志追溯&#xff0c;发现曾多次崩溃&#xff0c;后续也在其他k8s环境也有…

2024年Oceanbase考试认证的习题以及注意事项

OceanBase认证-OceanBase证书-数据库认证证书-OceanBasehttps://www.oceanbase.com/training考试认证在上边链接点击立即认证&#xff0c;进去以后就有学习资料和课程 此时需要注意的是不能只看视频不看资料&#xff0c;因为考试的时候有考的不是视频里面的内容&#xff0c;资料…