带有明确父协程的方式来启动协程
时间: 2023-06-17 18:08:37 浏览: 70
在Python的asyncio模块中,可以用`asyncio.create_task()`来创建一个协程任务,并且将其绑定到一个父协程上。这样,当父协程被取消时,所有子协程都会被取消。
下面是一个例子:
```python
import asyncio
async def child_coroutine():
print('Child coroutine started')
await asyncio.sleep(1)
print('Child coroutine finished')
async def parent_coroutine():
print('Parent coroutine started')
task = asyncio.create_task(child_coroutine())
await asyncio.sleep(0.5)
task.cancel()
try:
await task
except asyncio.CancelledError:
print('Child coroutine was cancelled')
print('Parent coroutine finished')
asyncio.run(parent_coroutine())
```
在这个例子中,我们定义了一个子协程`child_coroutine()`和一个父协程`parent_coroutine()`。在父协程中,我们使用`asyncio.create_task()`创建了一个子协程任务,并将其绑定到父协程上。随后,我们等待了一段时间,并使用`task.cancel()`取消了子协程任务。当子协程任务被取消时,我们捕获了`asyncio.CancelledError`异常,并打印了一条消息。
输出结果如下:
```
Parent coroutine started
Child coroutine started
Child coroutine was cancelled
Parent coroutine finished
```
可以看到,当我们取消了父协程中的子协程任务时,子协程任务被成功取消,并抛出了`CancelledError`异常。
阅读全文