如何在Python中创建异步程序_使用async和await实现高效并发

2025-05-10 11

Image

在 Python 中创建异步程序主要依赖 asyncio 库(Python 3.4+ 内置),以下是详细步骤和示例:


1. 核心概念

  • 协程(Coroutine):通过 async def 定义的函数,是异步任务的基本单元。
  • 事件循环(Event Loop):管理协程的执行和调度。
  • await:挂起当前协程,等待另一个协程或异步操作完成。

2. 基本步骤

(1) 定义异步函数

import asyncio

async def task1():
    print("开始 task1")
    await asyncio.sleep(2)  # 模拟耗时操作(非阻塞)
    print("结束 task1")

async def task2():
    print("开始 task2")
    await asyncio.sleep(1)
    print("结束 task2")

(2) 创建事件循环并运行任务

async def main():
    # 并行运行多个任务
    await asyncio.gather(task1(), task2())

# 启动事件循环
asyncio.run(main())

输出

开始 task1
开始 task2
结束 task2  # task2 先完成(因为 sleep 更短)
结束 task1

3. 关键方法

  • asyncio.run(coro):启动事件循环(Python 3.7+ 推荐)。
  • await coro:等待单个协程完成。
  • asyncio.gather(*coros):并行运行多个协程。
  • asyncio.create_task(coro):将协程包装为任务并行执行(需在事件循环中)。

4. 实际应用示例

异步HTTP请求(需安装 aiohttp

import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    html = await fetch("https://example.com")
    print(html[:200])  # 打印前200字符

asyncio.run(main())

5. 注意事项

  1. 阻塞代码会破坏异步:避免在协程中使用 time.sleep() 或同步 IO 操作,改用 await asyncio.sleep() 或异步库(如 aiofiles)。
  2. 错误处理:用 try/except 捕获协程中的异常。
  3. Python 版本:确保使用 Python 3.7+(推荐 3.10+)。

6. 进阶技巧

  • 任务控制:使用 asyncio.wait()asyncio.as_completed() 管理任务。
  • 超时设置await asyncio.wait_for(coro, timeout=5)
  • 底层事件循环:通过 loop = asyncio.get_event_loop() 自定义配置(高级场景)。

通过以上方法,你可以高效地编写异步程序,提升 IO 密集型应用的性能。

(www. n z w6.com)

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关