Python协程调度实例代码分析
封面图
•
2025-12-15
•
Python
145
0
0
0
当然!下面是一个**Python协程调度**的实例代码分析,帮助你理解协程(coroutine)在 Python 中是如何工作的,特别是使用 `asyncio` 框架进行调度。 --- ## ✅ 一、什么是协程? 协程是轻量级的并发模型,它允许在单线程中实现多个任务的“协作式多任务处理”,即任务之间可以主动让出控制权,而不是被操作系统抢占。 Python 中的协程主要通过 `async def` 定义,并使用 `await` 来调用其他协程。 --- ## ✅ 二、Python 协程调度的核心组件 - **`asyncio`**: Python 的异步 I/O 框架。 - **事件循环(Event Loop)**: 协程运行的主循环。 - **协程对象(Coroutine Object)**: 由 `async def` 定义的函数返回的对象。 - **`await`**: 用于等待另一个协程完成。 - **`asyncio.run()`**: 启动事件循环并运行主协程。 --- ## ✅ 三、示例代码:协程调度 ```python import asyncio import time # 定义一个协程函数 async def count(name, delay): for i in range(1, 6): print(f"{name}: {i}") await asyncio.sleep(delay) # 模拟异步操作(如IO) # 主函数 async def main(): # 创建两个协程任务 task1 = asyncio.create_task(count("A", 0.5)) task2 = asyncio.create_task(count("B", 1)) # 等待所有任务完成 await task1 await task2 # 运行主协程 if __name__ == "__main__": start_time = time.time() asyncio.run(main()) print(f"总耗时: {time.time() - start_time:.2f} 秒") ``` --- ## ✅ 四、代码分析 ### 1. `count` 函数 ```python async def count(name, delay): for i in range(1, 6): print(f"{name}: {i}") await asyncio.sleep(delay) ``` - 使用 `async def` 定义协程。 - `await asyncio.sleep(delay)` 是一个异步操作,表示让出控制权给事件循环,等待一段时间后再继续执行。 ### 2. `main` 函数 ```python async def main(): task1 = asyncio.create_task(count("A", 0.5)) task2 = asyncio.create_task(count("B", 1)) await task1 await task2 ``` - `asyncio.create_task()` 将协程包装成任务(Task),并安排其在事件循环中运行。 - `await task1` 和 `await task2` 表示等待这些任务完成。 > 注意:`create_task()` 会立即启动任务,而不会阻塞当前协程。因此,两个任务会同时运行。 ### 3. `asyncio.run(main())` - 启动事件循环并运行 `main()` 协程。 - 通常只在 Python 3.7+ 中使用。 --- ## ✅ 五、输出结果(示例) ``` A: 1 B: 1 A: 2 B: 2 A: 3 B: 3 A: 4 B: 4 A: 5 B: 5 总耗时: 1.00 秒 ``` ### 说明: - 协程 A 的延迟是 0.5 秒,所以它比 B 快完成。 - 但因为两个协程是**并发执行**的,所以总耗时接近于最长的任务时间(1秒)。 - 如果是同步代码,总耗时将是 `0.5 + 1 = 1.5` 秒。 --- ## ✅ 六、总结 | 组件 | 作用 | |------|------| | `async def` | 定义协程 | | `await` | 等待另一个协程完成 | | `asyncio.create_task()` | 创建任务 | | `asyncio.run()` | 启动事件循环 | --- ## ✅ 七、扩展阅读建议 - [Python 官方文档 - asyncio](https://docs.python.org/3/library/asyncio.html) - [asyncio 与 threading 的区别](https://realpython.com/async-io/) - [使用 `async/await` 编写异步网络请求](https://www.geeksforgeeks.org/async-await-in-python/) --- 如果你有更具体的场景(比如 HTTP 请求、数据库查询、Web 框架等),我也可以提供更针对性的示例和分析。需要吗?
上一篇:
Django---启动admin的报no such table: auth_user错误
下一篇:
Python修改列表元素的方法
标题录入,一次不能超过6条
留言
评论