Python - 如何在 python-trio 中取消由托儿所产生的特定任务

Python - How to cancel a specific task spawned by a nursery in python-trio

我有一个监听特定端口的异步函数。我想 运行 一次在几个端口上执行该功能,当用户想要停止侦听特定端口时,停止侦听该端口的功能。

之前我使用 asyncio 库来完成这个任务,我通过创建名称为唯一 ID 的任务来解决这个问题。

asyncio.create_task(Func(), name=UNIQUE_ID)

由于 trio 使用 nurseries 生成任务,我可以使用 nursery.child_tasks 查看 运行ning 任务,但这些任务无法命名它们,甚至无法取消任务按需任务

TL;DR

由于trio没有取消特定任务的cancel()函数,我该如何手动取消任务。

简单。您从任务中创建一个取消范围,return,并在需要时取消此范围:

async def my_task(task_status=trio.TASK_STATUS_IGNORED):
    with trio.CancelScope() as scope:
        task_status.started(scope)
        pass  # do whatever

async def main():
    async with trio.open_nursery() as n:
        scope = await n.start(my_task)
        pass  # do whatever
        scope.cancel()  # cancels my_task()

神奇的部分是 await n.start(task),它等待直到任务调用 task_status.started(x) 和 returns x 的值(或者 None 如果你留空)。