# Python 异步编程实战:asyncio 让并发更高效

## 前言

在 Python 编程中,异步编程是一个强大的工具,特别适合处理 I/O 密集型任务。本文将深入探讨 Python 的 asyncio 库,并通过实际代码示例展示如何使用它来提升程序的并发性能。

## 什么是异步编程?

异步编程允许程序在等待某些操作(如网络请求、文件读写)完成时,继续执行其他任务,而不是阻塞等待。这就像你在等水烧开时可以同时切菜,而不是傻等着。

## asyncio 基础概念

### async 和 await

- `async` 用于定义协程函数

- `await` 用于等待协程执行完成

### 基本示例

```python

import asyncio

import time

async def say_hello(delay):

    await asyncio.sleep(delay)

    print(f"Hello after {delay} seconds")

async def main():

    # 并发执行多个任务

    await asyncio.gather(

        say_hello(1),

        say_hello(2),

        say_hello(3)

    )

# 运行异步主函数

asyncio.run(main())

```

## 实战:并发网络请求

下面是一个实际的例子,展示如何使用 asyncio 并发获取多个网页内容:

```python

import asyncio

import aiohttp

async def fetch_url(session, url):

    async with session.get(url) as response:

        return await response.text()

async def fetch_all_urls(urls):

    async with aiohttp.ClientSession() as session:

        tasks = [fetch_url(session, url) for url in urls]

        results = await asyncio.gather(*tasks)

        return results

# 使用示例

urls = [

    'https://api.github.com',

    'https://httpbin.org/get',

    'https://jsonplaceholder.typicode.com/posts/1'

]

results = asyncio.run(fetch_all_urls(urls))

print(f"获取了 {len(results)} 个网页内容")

```

## 性能对比

让我们对比同步和异步方式的性能差异:

```python

import asyncio

import time

import requests

import aiohttp

# 同步方式

def sync_fetch(urls):

    start = time.time()

    for url in urls:

        requests.get(url)

    return time.time() - start

# 异步方式

async def async_fetch(urls):

    start = time.time()

    async with aiohttp.ClientSession() as session:

        tasks = [session.get(url) for url in urls]

        responses = await asyncio.gather(*tasks)

    return time.time() - start

# 测试

urls = ['https://httpbin.org/delay/1'] * 5

sync_time = sync_fetch(urls)

async_time = asyncio.run(async_fetch(urls))

print(f"同步耗时:{sync_time:.2f}秒")

print(f"异步耗时:{async_time:.2f}秒")

print(f"性能提升:{sync_time/async_time:.2f}倍")

```

## 常见应用场景

1. **Web 爬虫**:并发抓取多个页面

2. **API 服务**:同时处理多个客户端请求

3. **数据处理**:并行读取多个文件或数据库

4. **实时监控**:同时监控多个数据源

## 注意事项

- asyncio 适合 I/O 密集型任务,CPU 密集型任务建议使用多进程

- 避免在 async 函数中使用阻塞操作(如 time.sleep)

- 合理使用 `asyncio.gather()` 和 `asyncio.wait()` 控制并发度

## 总结

asyncio 是 Python 异步编程的核心库,掌握它可以显著提升程序的并发性能。通过本文的示例,希望你能够对 asyncio 有更深入的理解,并在实际项目中灵活运用。

---

*觉得有用就点个赞吧!欢迎在评论区分享你的异步编程经验。*

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐