asyncio包如何终止协程?分别举例,demo
时间: 2023-07-16 15:13:34 浏览: 137
好的,我明白了,我来回答你的问题。
asyncio包提供了多个工具用于控制协程的生命周期,包括取消协程。协程可以通过两种方式被取消:调用协程对象的cancel()方法或者让协程抛出一个asyncio.CancelledError异常。
以下是两个简单的示例,演示如何使用这两种方式来取消协程。
方法1:调用cancel()方法
```python
import asyncio
async def my_coroutine():
try:
while True:
print('协程正在运行...')
await asyncio.sleep(1)
except asyncio.CancelledError:
print('协程被取消了!')
async def main():
coro = asyncio.create_task(my_coroutine()) # 创建协程任务
await asyncio.sleep(5) # 等待 5 秒钟
coro.cancel() # 取消协程任务
asyncio.run(main())
```
上面的代码创建了一个协程任务,然后等待 5 秒钟后取消该任务。在my_coroutine()函数中,我们使用了一个while循环来模拟执行一些工作。当协程对象收到取消信号时,它将抛出asyncio.CancelledError异常。我们在该异常发生时捕获它并输出一条消息。
该代码的输出应该类似于:
```
协程正在运行...
协程正在运行...
协程正在运行...
协程正在运行...
协程正在运行...
协程被取消了!
```
方法2:让协程抛出一个CancelledError异常
```python
import asyncio
async def my_coroutine():
while True:
print('协程正在运行...')
await asyncio.sleep(1)
async def main():
coro = asyncio.create_task(my_coroutine()) # 创建协程任务
await asyncio.sleep(5) # 等待 5 秒钟
coro.cancel() # 取消协程任务
asyncio.run(main())
```
这里的代码几乎与前一个示例相同,除了在my_coroutine()函数中不再捕获asyncio.CancelledError异常而是让它抛出。这样一来,我们无需显式调用cancel()方法,协程任务将在收到取消信号时自动抛出该异常。
输出应该与前一个示例相同。
这就是两种取消asyncio协程的方法。当然,你也可以使用其他工具来终止协程。但总的来说,以上两种方式是最常用且最有效的。希望这能帮到你!
阅读全文