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

5 python python-asyncio python-trio

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

之前我使用 asyncio 库来完成此任务,并通过创建以唯一 id 作为名称的任务来解决此问题。

asyncio.create_task(Func(), name=UNIQUE_ID)
Run Code Online (Sandbox Code Playgroud)

由于 trio 使用 Nursery 来生成任务,我可以使用 Nursery.child_tasks 查看正在运行的任务,但这些任务没有办法命名它们,甚至没有办法按需取消任务

长话短说

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

Mat*_*chs 4

简单的。您创建一个取消范围,从任务中返回该范围,然后在需要时取消该范围:

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()
Run Code Online (Sandbox Code Playgroud)

神奇的部分是await n.start(task),它会等待直到任务调用task_status.started(x)并返回 的值x(或者None如果您将其留空)。