gpt4 book ai didi

python - 如何使用 asyncio 安排和取消任务

转载 作者:行者123 更新时间:2023-12-03 13:38:52 25 4
gpt4 key购买 nike

我正在编写一个客户端-服务器应用程序。连接时,客户端向服务器发送一个“心跳”信号,例如每秒一次。
在服务器端,我需要一种机制,我可以在其中添加异步执行的任务(或协程或其他东西)。此外,当客户端停止发送“心跳”信号时,我想取消客户端的任务。

换句话说,当服务器启动一个任务时,它有某种超时或 ttl,例如 3 秒。当服务器接收到“心跳”信号时,它会重新设置计时器 3 秒,直到任务完成或客户端断开连接(停止发送信号)。

这是 example从 pymotw.com 上的 asyncio 教程中取消任务。但是这里任务在event_loop开始之前就被取消了,不适合我。

import asyncio

async def task_func():
print('in task_func')
return 'the result'


event_loop = asyncio.get_event_loop()
try:
print('creating task')
task = event_loop.create_task(task_func())

print('canceling task')
task.cancel()

print('entering event loop')
event_loop.run_until_complete(task)
print('task: {!r}'.format(task))
except asyncio.CancelledError:
print('caught error from cancelled task')
else:
print('task result: {!r}'.format(task.result()))
finally:
event_loop.close()

最佳答案

您可以使用 asyncio Task通过 ensure_future() 执行任务的包装器方法。
ensure_future将自动将您的协程包装在 Task 中包装器并将其附加到您的事件循环。 Task然后,包装器还将确保协程从 await 'cranks-over'至await语句(或直到协程完成)。

换句话说,只需将常规协程传递给 ensure_future并分配结果 Task对象为变量。然后您可以调用 Task.cancel() 当你需要停止它时。

import asyncio

async def task_func():
print('in task_func')
# if the task needs to run for a while you'll need an await statement
# to provide a pause point so that other coroutines can run in the mean time
await some_db_or_long_running_background_coroutine()
# or if this is a once-off thing, then return the result,
# but then you don't really need a Task wrapper...
# return 'the result'

async def my_app():
my_task = None
while True:
await asyncio.sleep(0)

# listen for trigger / heartbeat
if heartbeat and my_task is None:
my_task = asyncio.ensure_future(task_func())

# also listen for termination of hearbeat / connection
elif not heartbeat and my_task:
if not my_task.cancelled():
my_task.cancel()
else:
my_task = None

run_app = asyncio.ensure_future(my_app())
event_loop = asyncio.get_event_loop()
event_loop.run_forever()

请注意,任务适用于需要在不中断主流程的情况下继续在后台工作的长时间运行的任务。如果您只需要一个快速的一次性方法,那么只需直接调用该函数即可。

关于python - 如何使用 asyncio 安排和取消任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40016501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com