asyncio

### Python 中使用 `asyncio` 库实现异步编程 #### 创建和运行协程 在 Python 的 `asyncio` 编程模型中,程序的核心是事件循环。所有的异步任务都由这个事件循环管理并调度执行。 创建一个简单的异步函数需要使用 `async def` 关键字声明该函数为协程函数,在其中可以调用其他协程或等待某些条件满足再继续执行。下面是一个基本的例子: ```python import asyncio async def say_after(delay, what): await asyncio.sleep(delay) print(what) async def main(): task1 = asyncio.create_task(say_after(1, 'hello')) task2 = asyncio.create_task(say_after(2, 'world')) # Wait until both tasks are completed (should take around 2 seconds.) await task1 await task2 # Run the event loop to execute coroutine. asyncio.run(main()) ``` 这段代码展示了两个并发的任务被安排到同一个事件循环里去执行[^1]。 #### 并发执行多个任务 当有多个独立的任务时,可以通过 `gather()` 或者 `create_task()` 来启动这些任务,并让它们并发地运行而不是顺序执行每一个任务。这有助于提高效率特别是对于IO密集型的应用场景。 这里有一个例子说明了这一点: ```python import asyncio async def async_task(name, delay): print(f"Task {name} started at", datetime.datetime.now()) await asyncio.sleep(delay) print(f"Task {name} finished at", datetime.datetime.now()) async def run_tasks_concurrently(): # Create multiple concurrent tasks using gather() await asyncio.gather( async_task("A", 2), async_task("B", 1), async_task("C", 3) ) asyncio.run(run_tasks_concurrently()) ``` 此段代码会同时发起三个不同延迟时间的任务 A、B 和 C,而不会按照先后次序依次阻塞等待每个任务结束[^4]。 #### 使用上下文管理器处理资源 有时可能希望在一个特定范围内初始化一些资源并在退出范围之前清理它;这时就可以利用支持异步协议的对象作为上下文管理者来简化这类逻辑。例如连接池或其他形式的持久化存储接口等。 下面是关于如何构建自定义异步上下文管理器的一个实例: ```python class AsyncContextManager: def __init__(self): pass async def __aenter__(self): await asyncio.sleep(1) # Simulate asynchronous setup work here... return self async def __aexit__(self, exc_type, exc_val, exc_tb): await asyncio.sleep(1) # Cleanup after usage... async def do_something(self): return "Result from doing something asynchronously." async def use_context_manager(): async with AsyncContextManager() as manager: result = await manager.do_something() print(result) asyncio.run(use_context_manager()) ``` 在这个案例中,`AsyncContextManager` 类实现了必要的魔法方法以便能够配合 `async with` 语句一起工作,从而允许更优雅地管理和释放资源[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值