Python - 如何在 python-trio 中取消由托儿所产生的特定任务
Python - How to cancel a specific task spawned by a nursery in python-trio
我有一个监听特定端口的异步函数。我想 运行 一次在几个端口上执行该功能,当用户想要停止侦听特定端口时,停止侦听该端口的功能。
之前我使用 asyncio 库来完成这个任务,我通过创建名称为唯一 ID 的任务来解决这个问题。
asyncio.create_task(Func(), name=UNIQUE_ID)
由于 trio 使用 nurseries 生成任务,我可以使用 nursery.child_tasks 查看 运行ning 任务,但这些任务无法命名它们,甚至无法取消任务按需任务
TL;DR
由于trio没有取消特定任务的cancel()函数,我该如何手动取消任务。
简单。您从任务中创建一个取消范围,return,并在需要时取消此范围:
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)
和 returns x
的值(或者 None
如果你留空)。
我有一个监听特定端口的异步函数。我想 运行 一次在几个端口上执行该功能,当用户想要停止侦听特定端口时,停止侦听该端口的功能。
之前我使用 asyncio 库来完成这个任务,我通过创建名称为唯一 ID 的任务来解决这个问题。
asyncio.create_task(Func(), name=UNIQUE_ID)
由于 trio 使用 nurseries 生成任务,我可以使用 nursery.child_tasks 查看 运行ning 任务,但这些任务无法命名它们,甚至无法取消任务按需任务
TL;DR
由于trio没有取消特定任务的cancel()函数,我该如何手动取消任务。
简单。您从任务中创建一个取消范围,return,并在需要时取消此范围:
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)
和 returns x
的值(或者 None
如果你留空)。