Python async案例如何定义异步函数

wen python案例 32

本文目录导读:

Python async案例如何定义异步函数

  1. 基本异步函数定义
  2. 多个异步函数并发执行
  3. 带参数的异步函数
  4. 异步上下文管理器
  5. 超时控制的异步函数
  6. 完整的实际案例:异步Web请求

我来为你介绍Python中定义异步函数的方法和完整案例。

基本异步函数定义

import asyncio
# 使用 async def 定义异步函数
async def hello():
    print("Hello")
    await asyncio.sleep(1)  # 模拟异步操作
    print("World")
    return "完成"
# 运行异步函数
async def main():
    result = await hello()
    print(result)
# 启动事件循环
asyncio.run(main())

多个异步函数并发执行

import asyncio
import time
async def task(name, seconds):
    print(f"任务 {name} 开始")
    await asyncio.sleep(seconds)  # 模拟耗时操作
    print(f"任务 {name} 完成,耗时 {seconds}秒")
    return f"任务{name}的结果"
async def main():
    start = time.time()
    # 并发执行多个任务
    tasks = [
        task("A", 2),
        task("B", 3),
        task("C", 1)
    ]
    # 等待所有任务完成
    results = await asyncio.gather(*tasks)
    print(f"总耗时: {time.time() - start:.2f}秒")
    print(f"结果: {results}")
asyncio.run(main())

带参数的异步函数

import asyncio
async def fetch_data(url, timeout=10):
    """
    模拟异步获取数据
    """
    print(f"正在从 {url} 获取数据...")
    await asyncio.sleep(timeout)  # 模拟网络请求
    # 模拟返回的数据
    data = {
        "url": url,
        "status": 200,
        "content": f"这是来自 {url} 的数据"
    }
    return data
async def process_data(data):
    """处理数据的异步函数"""
    print(f"处理数据: {data['url']}")
    await asyncio.sleep(0.5)
    data["processed"] = True
    return data
async def main():
    # 获取数据
    raw_data = await fetch_data("https://api.example.com/users", 2)
    # 处理数据
    processed_data = await process_data(raw_data)
    print(f"最终结果: {processed_data}")
asyncio.run(main())

异步上下文管理器

import asyncio
class AsyncResource:
    async def __aenter__(self):
        print("异步打开资源")
        await asyncio.sleep(1)
        return self
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        print("异步关闭资源")
        await asyncio.sleep(0.5)
    async def do_work(self):
        print("执行异步工作")
        await asyncio.sleep(0.5)
        return "工作完成"
async def main():
    async with AsyncResource() as resource:
        result = await resource.do_work()
        print(result)
asyncio.run(main())

超时控制的异步函数

import asyncio
async def long_running_task():
    print("开始长时间运行的任务")
    await asyncio.sleep(10)  # 模拟长时间操作
    return "任务结果"
async def main():
    try:
        # 设置超时时间
        result = await asyncio.wait_for(long_running_task(), timeout=3)
        print(result)
    except asyncio.TimeoutError:
        print("任务超时!")
asyncio.run(main())

完整的实际案例:异步Web请求

import asyncio
import aiohttp  # 需要安装: pip install aiohttp
async def fetch_url(session, url):
    """异步获取URL内容"""
    try:
        async with session.get(url) as response:
            if response.status == 200:
                content = await response.text()
                return {"url": url, "status": response.status, "length": len(content)}
            else:
                return {"url": url, "status": response.status, "error": "请求失败"}
    except Exception as e:
        return {"url": url, "status": 0, "error": str(e)}
async def main():
    urls = [
        "https://httpbin.org/delay/1",
        "https://httpbin.org/delay/2",
        "https://httpbin.org/delay/3",
    ]
    async with aiohttp.ClientSession() as session:
        # 并发请求多个URL
        tasks = [fetch_url(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        for result in results:
            print(f"URL: {result['url']}")
            print(f"状态码: {result.get('status')}")
            print(f"内容长度: {result.get('length', 'N/A')}")
            print("-" * 50)
asyncio.run(main())
  1. 使用 async def 关键字定义异步函数
  2. 使用 await 调用其他异步函数
  3. 使用 asyncio.run() 启动事件循环
  4. 使用 asyncio.gather() 并发执行多个任务
  5. 使用 async with 定义异步上下文管理器

这些就是定义和使用Python异步函数的主要方法,异步编程可以显著提高I/O密集型应用的性能。

抱歉,评论功能暂时关闭!