当前位置: 首页 > news >正文

深入理解asyncio:异步编程的基础用法

引言:

随着计算机硬件的不断发展,对于异步编程的需求也越来越强烈。Python中的asyncio模块为开发者提供了一种强大而灵活的异步编程方式。本文将介绍asyncio的基础用法,包括async/await/run语句的使用、多个协程的并发执行、以及在协程中进行网络请求的注意事项。

1. async/await/run语句介绍

在Python中,asyncawait关键字是异步编程的基础。

async用于定义一个协程(coroutine)。

await则用于挂起当前协程的执行,等待其他协程或异步任务完成。

run语句是执行协程的一种方式,通过它我们可以启动一个协程并等待其完成。

import asyncio
async def example_coroutine():print("Start Coroutine")await asyncio.sleep(2)print("End Coroutine")
async def main():await example_coroutine()
asyncio.run(main())

在上述示例中,main函数是一个协程,通过asyncio.run(main())启动并执行,然后等待example_coroutine协程的完成。

注意

1.await只能用于协程中,所以主函数main必须也要是async协程。

2.主函数的启动,必须使用asyncio.run,否则主程序执行完,协程也会终止。

2. 多个协程的并发执行

asyncio.gather是一个强大的工具,可以同时运行多个协程,等待它们全部完成。与单独多次调用await语句相比,asyncio.gather更加简洁和高效。

import asyncioasync def fetch_data():# ... some async operation
async def fetch_data1():# ... some async operation
async def main():task1 = asyncio.create_task(fetch_data())task2 = asyncio.create_task(fetch_data1())await asyncio.gather(task1, task2)print('All tasks completed.')
asyncio.run(main())

在上述示例中,task1task2是两个并发运行的协程任务,asyncio.gather(task1, task2)等待它们全部完成。这种方式能更有效地利用异步并发的优势。

3. urllib.request和requests包不支持协程,只可使用aiohttp

urllib.requestrequests是常见的HTTP请求库,但它们都是同步的,不能直接在协程中使用。为了在协程中进行网络请求,推荐使用支持异步的库,例如aiohttp

import aiohttp
import asyncioasync def fetch_data(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():result1 = await fetch_data("https://example.com")print(result1)result2 = await fetch_data("https://example2.com")print(result2)asyncio.run(main())

在这个例子中,aiohttp提供了异步的HTTP客户端,允许在进行网络请求时保持异步执行,从而充分发挥协程并发的优势。

结论

asyncio为Python提供了一种强大的异步编程方式,通过asyncawaitrun等语句,以及asyncio.gather的使用,我们能够轻松实现并发执行的异步任务。在进行网络请求时,选择支持异步的库(如aiohttp)是确保协程异步性能的关键。希望通过本文的介绍,读者能够更好地理解和运用asyncio进行异步编程。

http://www.lryc.cn/news/256615.html

相关文章:

  • Android 消息分发机制解读
  • 【ML】LSTM应用——预测股票(基于 tensorflow2)
  • 汇编语言程序设计实验报告
  • 广域网(WAN)设备通信过程(通信流程、通信步骤、通信顺序、设备通信、主机通信)(MAC地址在本地链路中的作用)跳跃(hop)
  • ExoPlayer架构详解与源码分析(10)——H264Reader
  • 智能优化算法应用:基于粒子群算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 微积分-序言
  • ArchLinux安装详细步骤
  • react 学习笔记 李立超老师 | (学习中~)
  • Docker镜像和容器的简单操作
  • 章鱼网络进展月报 | 2023.11.1-11.30
  • 基于Maven构建OSGI应用(Maven和OSGI结合)
  • oracle分组排序后取第一条
  • MAMBA介绍:一种新的可能超过Transformer的AI架构
  • win系统一台电脑安装两个不同版本的mysql教程
  • esp32-s3部署yolox_nano进行目标检测
  • TCP传输数据的确认机制
  • 使用Ansible Expect模块实现自动化交互式任务
  • 51单片机独立按键以及矩阵按键的使用以及其原理--独立按键 K1 控制 D1 指示灯亮灭以及数码管显示矩阵按键 S1-S16 按下后键值 0-F
  • chrome安装jsonview
  • 使用TouchSocket适配一个c++的自定义协议
  • VSC改造MD编辑器及图床方案分享
  • SpringBoot的依赖管理和自动配置
  • linux 定时任务
  • 增强现实中的真实人/机/环与虚拟人/机/环
  • Python网络爬虫环境的安装指南
  • 【MyBatis系列】MyBatis字符串问题
  • 【Java】构建表达式二叉树和表达式二叉树求值
  • 采用Python 将PDF文件按照页码进行切分并保存
  • H264视频编码原理