Python—如何取消Python trio中托儿所生成的特定任务
我有一个异步函数,可以监听特定端口。我希望一次在几个端口上运行该函数,当用户希望停止侦听某个特定端口时,停止该端口上的函数侦听 以前,我使用asyncio库来完成此任务,并通过创建具有唯一id作为名称的任务来解决此问题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.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
。