Python 异步编程 asyncio简介及基本用法

2025-05-09 01:50

本文主要是介绍Python 异步编程 asyncio简介及基本用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python...

1、asyncio是什么

async io(异步输入输出)是一种编程模式,它允许程序在等待I/O操作(如文件读写、网络请求等)完成时继续执行其他任务。通过这种方式,可以更有效地利用CPU资源和提高程序的响应速度,尤其是在处理大量并发连接或www.chinasem.cn长时间运行的任务时。

asynciopython 的一个库,用于编写并发代码,使用协程、任务和 Futures 来处理 I/O 密集型和高延迟操作

正常的发送请求,发送请求后会等待连接建立和服务器响应,这段时间内cpu是空闲的,也无法切换到其他任务

asyncio允许当执行的任务遇到IO密集型任务时(如发送请求),cpu空闲,将cpu切换到其他任务上,做其他任务,等请求建立后,可以重新切换回来,继续进行操作

IO密集型任务

IO 密集型任务是指那些大部分时间都花费在输入/输出(I/O)操作上的任务。这些任务的特点是,CPU 的计算量相对较小,而等待 I/O 操作完成的时间较长。常见的 IO 密集型任务包括文件读写、网络请求、数据库查询等。

例如连接网络,发起连接时需要cpu参与,等待连接过程是不需要cpu参与,这段时间,cpu可以空闲下来,进行其他操作,等待到连接建立成功后需要传输数据了cpu再进行操作

特征

  • 长时间等待:大量时间花在等待外部设备或服务的响应上。
  • 低 CPU 占用:CPU 在等待 I/O 操作完成时处于空闲状态,因为不需要进行复杂的计算。

2、怎么用

1、基本用法

import asyncio
# 定义一个异步函数
async def my_coroutine():
    print("开始任务")
    # 模拟一个耗时操作
    await asyncio.sleep(1)  # 等待1秒
    print("任务完成")
# 创建事件循环
loop = asyncio.get_event_loop()
# 运行异步函数直到完成
loop.run_until_complete(my_coroutine())
# 关闭事件循环
loop.close()

定义了一个名为my_coroutine的协程(coroutine),它会打印一条开始任务,然后暂停执行一段时间(模拟I/O操作),最后再打印任务完成。await关键字用于暂停协程的执行,直到等待的操作完成。asyncio.sleep是专门用来模拟异步等待的函数,在实际应用中,你可能会替换为真正的异步I/O操作,比javascript如网络请求或文件操作。

如果你想要同时运行多个异步任务,你可以使用asyncio.gather或者asyncio.wait等函数来管理这些任务。

实际上这样显示不出协程的用途

但是如果有多个任务就可以了

import asyncio
# 定义一个异步函数
async def my_coroutine1():
    print("开始任务1")
    # 模拟一个耗时操作
    await asyncio.sleep(1)  # 等待1秒
    print("任务完成1")
async def my_coroutine2():
    print("开始任务2")
    # 模拟一个耗时操作
    await asyncio.sleep(1)  # 等待1秒
    print("任务完成2")
async def main():
    results =  await asyncio.gather(my_coroutine1(), my_coroutine2())
    print(results)
if __name__ == '__main__':
    asyncio.run(main())

Python 异步编程 asyncio简介及基本用法

2、关键字 async

定义

async关键字用来声明一个函数为异步函数(即协程)。当一个函数被定义为异步时,它不会像普通函数那样立即执行其内部代码,而是返回一个协程对象。这个协程对象可以在事件循环中调度执行。

async def function_name(parameters):
    # 协程体

使用场景

当你需要定义一个可能会进行长时间等待的函数(如网络请求、文件读写等),你可以使用async来标记该函数,表明它是一个异步操作,并且可以通过await来暂停它的执行直到某些条件满足。

await

定义await关键字只能出现在由async定义的函数内部,用于暂停当前协程的执行,直到所等待的另一个协程或异步操作完成。await后面通常跟的是一个可等待对象(如另一个协程、FutureTask等)。

语法

await expression

使用场景

当你在一个异步函数内需要等待另一个异步操作的结果时,你可以使用await暂停当前函数的执行,让出CPU资源给其他任务,直到等待的操作完成。

asyncio.run()

这是运行顶层协程的主要方式,适用于Python 3.7+版本。它会创建一个新的事件循环并运行传入的协程,直到协程完成。完成后,它会关闭事件循环并返回协程的结果。

asyncio.create_task()

用于在事件循环中并发启动多个协程。它接受一个协程作为参数,并返回一个Task对象,该对象代表了正在运行的任务。这有助于管理并发任务,比如同时发起多个网络请求。

import asyncio
async def task1():
    print("Task 1 started")
    await asyncio.sleep(1)
    print("Task 1 completed")
async def task2():
    print("Task 2 started")
    await asyncio.sleep(2)
    print("Task 2 completed")
async def main():
    # 创建任务但不等待它们
    task_1 = asyncio.create_task(task1())
    task_2 = asyncio.create_task(task2())
    # 执行其他代码...
    # 等待任务完成
    await task_1
    await task_2
# 运行主函数
asyncio.run(main())

asyncio.gather()

如果想要并发地运行多个协程并且收集所有结果,可以使用gather。它可以接收多个协程作为参数,并返回一个包含所有协程返回值的列表。

import asyncio
async def task1():
    print("Task 1 started")
    await asyncio.sleep(1)
    print("Task 1 completed")
    reHIhptSturn "Result from Task 1"
async def task2():
    print("Task 2 started")
    await asyncio.sleep(2)
    print("Task 2 completed")
    return "Result from Task 2"
async def main():
    # 使用 gather 同时运行多个任务
    results = await asyncio.gather(task1(), task2())
    print(results)
# 运行主函数
asyncio.run(main())

asyncio.wait() 可以用来等待一组协程中的任意数量完成。你可以指定不同的等待条件,如全部完成、任何一个完成等。

import asyjsncio
async def task1():
    print("Task 1 started")
    await asyncio.sleep(1)
    print("Task 1 completed")
async def task2():
    print("Task 2 started")
    await asyncio.sleep(2)
    print("Task 2 completed")
async def main():
    # 创建任务列表
    tasks = [task1(), task2()]
    # 等待所有任务完成
    done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)
    for future in done:
        print(future.result())
# 运行主函数
asyncio.run(main())

如果你想按完成顺序处理结果,而不是按照任务创建的顺序,可以使用 asyncio.as_completed()。它返回一个迭代器,在每个协程完成后产生它的Future对象。

import asyncio
async def task1():
    print("Task 1 started")
    await asyncio.sleep(1)
    print("Task 1 completed")
    return "Result from Task 1"
async def task2():
    print("Task 2 started")
    await asyncio.sleep(2)
    print("Task 2 completedphp")
    return "Result from Task 2"
async def main():
    # 创建任务列表
    tasks = [task1(), task2()]
    # 按完成顺序处理结果
    for future in asyncio.as_completed(tasks):
        result = await future
        print(result)
# 运行主函数
asyncio.run(main())
  • asyncio.gather():适合同时启动多个任务,并等待所有任务完成。
  • asyncio.create_task():用于立即启动任务并在之后等待它们完成。
  • asyncio.wait():提供灵活的等待条件,例如等待所有或任一任务完成。
  • asyncio.as_completed():根据任务完成的顺序来处理结果。

到此这篇关于Python 异步编程 asyncio简介及基本用法的文章就介绍到这了,更多相关Python asyncio内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Python 异步编程 asyncio简介及基本用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154535

相关文章

Python利用GeoPandas打造一个交互式中国地图选择器

《Python利用GeoPandas打造一个交互式中国地图选择器》在数据分析和可视化领域,地图是展示地理信息的强大工具,被将使用Python、wxPython和GeoPandas构建的交互式中国地图行... 目录技术栈概览代码结构分析1. __init__ 方法:初始化与状态管理2. init_ui 方法:

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控