我有一个异步函数,它监听特定的端口。我想一次在几个端口上运行该函数,当用户想要停止侦听特定端口时,停止侦听该端口上的函数。
以前我使用asyncio库来完成这个任务,我通过创建一个唯一的id作为它们的名称来解决这个问题。
asyncio.create_task(Func(), name=UNIQUE_ID)因为trio使用托儿所生成任务,所以我可以使用nursery.child_tasks查看正在运行的任务,但是任务没有命名的方法,甚至没有按需取消任务的方法
TL;DR
由于trio没有用于取消特定任务的cancel()函数,如何手动取消任务呢?
发布于 2020-03-14 02:51:04
很简单。您创建一个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()最神奇的部分是await n.start(task),它会一直等到任务调用task_status.started(x)并返回x的值(如果将该值保留为空,则返回None )。
https://stackoverflow.com/questions/60674136
复制相似问题