学习day52
发布人:shili8
发布时间:2025-02-25 22:05
阅读次数:0
**Day52: 异步编程与协程**
在前面的日子中,我们已经学到了很多关于 Python 的基础知识,包括数据类型、控制结构、函数等。然而,在实际的开发过程中,我们经常会遇到一些需要异步处理的任务,比如网络请求、文件操作等。在这种情况下,Python 提供了多种方式来实现异步编程,其中最常见的是使用协程(Coroutine)。
**什么是协程**
协程是一种特殊的函数,它可以在不切换线程的情况下暂停执行并让出控制权给其他协程。这样可以大大提高程序的并发性和效率。
**asyncio 库**
Python 的 asyncio 库提供了一个高级别的 API 来实现异步编程。它允许我们定义协程函数,并使用 `await` 关键字来暂停执行并让出控制权给其他协程。
### 示例1: 简单的协程
import asyncioasync def hello_world(): print("Hello, world!") await asyncio.sleep(1) # 暂停1 秒 print("Goodbye, world!") async def main(): await hello_world() asyncio.run(main())
在这个例子中,我们定义了一个 `hello_world` 协程函数,它打印 "Hello, world!",然后暂停1 秒后再打印 "Goodbye, world!"。我们使用 `await asyncio.sleep(1)` 来实现暂停。
### 示例2: 并发执行多个协程
import asyncioasync def task1(): print("Task1 started") await asyncio.sleep(1) print("Task1 finished") async def task2(): print("Task2 started") await asyncio.sleep(2) print("Task2 finished") async def main(): await asyncio.gather(task1(), task2()) asyncio.run(main())
在这个例子中,我们定义了两个协程函数 `task1` 和 `task2`,它们分别暂停1 秒和2 秒后打印 "finished"。我们使用 `await asyncio.gather()` 来并发执行这两个协程。
### 示例3: 使用asyncio.create_task() 创建任务
import asyncioasync def task(): print("Task started") await asyncio.sleep(1) print("Task finished") async def main(): task_handle = asyncio.create_task(task()) await asyncio.sleep(2) # 等待2 秒 print("Main finished") asyncio.run(main())
在这个例子中,我们使用 `asyncio.create_task()` 来创建一个任务,执行 `task` 协程函数。我们等待2 秒后再打印 "Main finished"。
### 总结在本日的学习中,我们学到了如何使用协程和 asyncio 库来实现异步编程。在实际的开发过程中,这种技术可以大大提高程序的并发性和效率。我们还学习了如何并发执行多个协程,使用 `await` 关键字暂停执行,并使用 `asyncio.create_task()` 创建任务。
###代码注释* 使用 `async def` 定义协程函数* 使用 `await` 关键字暂停执行* 使用 `asyncio.sleep()` 暂停一定时间* 使用 `asyncio.gather()` 并发执行多个协程* 使用 `asyncio.create_task()` 创建任务### 练习题1. 写一个协程函数,打印 "Hello, world!",然后暂停2 秒后再打印 "Goodbye, world!"
2. 使用 asyncio 库并发执行两个协程函数,每个函数暂停3 秒后打印 "finished"
3. 使用asyncio.create_task()创建一个任务,执行一个协程函数,然后等待5 秒后再打印"Main finished"
### 参考答案1.
import asyncio async def hello_world(): print("Hello, world!") await asyncio.sleep(2) print("Goodbye, world!") async def main(): await hello_world() asyncio.run(main())
2.
import asyncio async def task1(): print("Task1 started") await asyncio.sleep(3) print("Task1 finished") async def task2(): print("Task2 started") await asyncio.sleep(3) print("Task2 finished") async def main(): await asyncio.gather(task1(), task2()) asyncio.run(main())
3.
import asyncio async def task(): print("Task started") await asyncio.sleep(5) print("Task finished") async def main(): task_handle = asyncio.create_task(task()) await asyncio.sleep(10) # 等待10 秒 print("Main finished") asyncio.run(main())