5 python python-asyncio python-trio
我有一个监听特定端口的异步函数。我想一次在几个端口上运行该函数,当用户想要停止在特定端口上侦听时,停止在该端口上侦听的函数。
之前我使用 asyncio 库来完成此任务,并通过创建以唯一 id 作为名称的任务来解决此问题。
asyncio.create_task(Func(), name=UNIQUE_ID)
Run Code Online (Sandbox Code Playgroud)
由于 trio 使用 Nursery 来生成任务,我可以使用 Nursery.child_tasks 查看正在运行的任务,但这些任务没有办法命名它们,甚至没有办法按需取消任务
由于 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()
Run Code Online (Sandbox Code Playgroud)
神奇的部分是await n.start(task),它会等待直到任务调用task_status.started(x)并返回 的值x(或者None如果您将其留空)。
| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |