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

Python—如何取消Python trio中托儿所生成的特定任务,python,python-asyncio,python-trio,Python,Python Asyncio,Python Trio,我有一个异步函数,可以监听特定端口。我希望一次在几个端口上运行该函数,当用户希望停止侦听某个特定端口时,停止该端口上的函数侦听 以前,我使用asyncio库来完成此任务,并通过创建具有唯一id作为名称的任务来解决此问题 asyncio.create_task(Func(), name=UNIQUE_ID) 由于trio使用Nurries生成任务,因此我可以通过使用turry.child_任务查看正在运行的任务,但这些任务没有命名方法,甚至没有按需取消任务的方法 TL;博士 由于trio没有取消

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

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

asyncio.create_task(Func(), name=UNIQUE_ID)
由于trio使用Nurries生成任务,因此我可以通过使用turry.child_任务查看正在运行的任务,但这些任务没有命名方法,甚至没有按需取消任务的方法

TL;博士
由于trio没有取消特定任务的cancel()函数,如何手动取消任务。

简单。创建取消作用域,从任务返回该作用域,并在需要时取消此作用域:

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()

神奇的部分是
wait n.start(task)
,它等待任务调用
task\u status.started(x)
,并返回
x
的值(或
None
,如果您将其留空)。

您能解释一下这段代码的作用吗?我试图阅读文档,但我仍然不知道这是如何工作的。也可以使用托儿所.start_soon()函数,但仍然使用cancel()函数来取消子任务吗?需要解释什么?您的任务在作用域中运行,您可以取消作用域,因此
task\u status.started()
通过
wait托儿所的结果将其传递回
main
。启动
,以便
main
可以在需要时执行取消操作。您需要等待,直到任务继续执行到创建范围并传递回句柄的点。你当然可以用一个共享对象和一个
trio.Event
或其他什么手动完成所有这些,但既然trio已经为你提供了一个内置的单行程序,你为什么还要这么做呢?我也不明白。看起来正在启动的任务只是将其打开以在某个点取消,而不是随意从外部函数或事件取消。比如说,如果我使用Trio来运行一个永远不会返回并永远运行的后台任务,那么当某个值变为真时,或者什么时候,我该如何停止它?我在asyncio旁边使用了一个Trio任务,当尝试停止程序时,asyncio会引发一个运行时错误,表示循环已经关闭。因此,我只能
sys.exit()
os.\u exit(0)
,否则这三个部分将永远持续下去。我认为我的方法没有效率。你是什么意思,你怎么阻止它?在某个时刻,您的任务将调用
wait trio.sleep()
或基本上任何其他异步trio函数。此时,Trio检查是否有人在其运行的任何cancel作用域上调用了
cancel
,如果是,则会引发
Trio.Cancelled
异常。不,您不能以这种方式将trio与asyncio一起使用。他们是不同的。三位医生清楚地说了这一点。如果您真的需要这样做的话,还有
trio\u asyncio