python测试开发基础---asyncio协程

asyncio 是 Python 标准库中的一个库,用于实现 异步 I/O协程 的并发编程。它提供了事件循环、任务调度、异步 I/O 操作等功能,特别适用于 I/O 密集型任务(如网络请求、文件操作)而非 CPU 密集型任务。

gevent 类似,asyncio 通过 协程coroutines)进行并发任务调度,但它不依赖于自动打补丁的方式,而是通过显式使用 awaitasync 关键字来实现异步操作。

核心概念与功能

  1. 协程 (Coroutine)

    • 通过 async def 定义一个协程函数,使用 await 关键字来等待其他协程完成。
    • 协程是 asyncio 的核心概念,用于并发执行任务而不需要使用线程或进程。
  2. 事件循环 (Event Loop)

    • asyncio 的并发模型基于事件循环,通过事件循环来调度多个协程的执行。
    • 一个程序通常有一个全局事件循环,可以通过 asyncio.run()asyncio.get_event_loop() 来启动事件循环。
  3. 任务 (Task)

    • 通过 asyncio.create_task() 可以调度协程并并发执行任务。
    • 每个任务代表一个独立的执行单元,任务之间通过事件循环来进行切换。
  4. 异步 I/O

    • asyncio 提供了很多异步 I/O 操作,比如文件、网络连接、数据库查询等。通过使用 await 来处理 I/O 操作,程序可以在 I/O 操作的等待过程中执行其他任务。

基本使用示例

import asyncio

async def task_1():
    print('Task 1 start')
    await asyncio.sleep(2)
    print('Task 1 end')

async def task_2():
    print('Task 2 start')
    await asyncio.sleep(1)
    print('Task 2 end')

async def task_3():
    print('Task 3 start')
    await asyncio.sleep(0.5)
    print('Task 3 end')

async def main():
    # 创建任务并发执行
    tasks = [
        asyncio.create_task(task_1()),
        asyncio.create_task(task_2()),
        asyncio.create_task(task_3())
    ]
    # 等待所有任务完成
    await asyncio.gather(*tasks)

# 启动事件循环并执行协程
asyncio.run(main())

重要概念

  1. async/await

    • async 用于定义异步函数(协程),await 用于等待异步操作完成。协程的执行是非阻塞的,遇到 await 时,会暂停当前协程,等待资源可用。
  2. 事件循环 (Event Loop)

    • 事件循环是 asyncio 的核心,它负责管理协程的调度和执行。可以通过 asyncio.run() 启动一个事件循环,并在其中执行异步任务。
  3. 任务 (Task)

    • 任务是由协程创建的执行单元,它会在事件循环中并发执行。使用 asyncio.create_task() 创建一个任务后,任务会立即开始执行,但并不会阻塞事件循环。
  4. 同步与异步 I/O

    • asyncio 的异步 I/O 函数(如 asyncio.sleep()asyncio.open_connection())允许在等待 I/O 完成时让出控制权,使得其他协程可以在此期间运行。

使用场景

  • 网络 I/O 密集型任务:如 Web 服务器、爬虫、WebSocket 服务器、数据库查询。
  • 异步文件操作:可以使用异步函数处理大量文件 I/O。
  • 并发任务调度:用于并发执行大量的小任务。

gevent 的对比

特性asynciogevent
核心概念基于事件循环的协程 (async/await)基于 Greenlets 的协程
标准库支持
依赖外部库需要安装 gevent
I/O 操作需要显式地用 await通过 monkey-patch 自动处理
使用复杂度需要用 asyncawait 管理相对简单,封装程度更高
适用场景网络 I/O,文件操作等主要用于 I/O 密集型任务
任务调度显式调度,通过 create_task自动调度

常用函数

  1. asyncio.run():启动事件循环并执行协程。

    asyncio.run(main())
    
  2. asyncio.create_task():创建一个异步任务,使得协程能够并发运行。

    task = asyncio.create_task(coroutine_func())
    
  3. asyncio.gather():等待多个协程并发执行并返回结果。

    results = await asyncio.gather(task1, task2, task3)
    
  4. asyncio.sleep():异步睡眠,暂停当前协程并让出控制权。

    await asyncio.sleep(seconds)
    

事件循环管理

# 创建事件循环
loop = asyncio.get_event_loop()

# 执行协程直到完成
loop.run_until_complete(main())

asyncio 是现代 Python 中进行并发编程的首选工具,尤其适用于网络应用、异步 I/O 操作和高并发任务。通过显式的 async/await 语法,使得代码逻辑更加清晰,虽然需要编写更多的模板代码,但能带来强大的并发能力。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值