首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何取消由python-trio中的托儿所产生的特定任务

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

Stack Overflow用户
提问于 2020-03-14 00:34:41
回答 1查看 644关注 0票数 4

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

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

代码语言:javascript
复制
asyncio.create_task(Func(), name=UNIQUE_ID)

因为trio使用托儿所生成任务,所以我可以使用nursery.child_tasks查看正在运行的任务,但是任务没有命名的方法,甚至没有按需取消任务的方法

TL;DR

由于trio没有用于取消特定任务的cancel()函数,如何手动取消任务呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-14 02:51:04

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

代码语言:javascript
复制
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)并返回x的值(如果将该值保留为空,则返回None )。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60674136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档