Python 如何从视图中的异步IO事件循环中获取任务?
在使用aiohttp编写的web应用程序中,我有两个端点。首先是启动异步IO任务,这是一个无限循环。第二个计划是取消某些任务。由于asyncio任务没有任何id概念,我有点困惑。 是否可以在数据库中保存任务的某些标识符? 这是正确的方法还是lib已经为这类问题提供了解决方案 aiohttp_应用程序/views.pyPython 如何从视图中的异步IO事件循环中获取任务?,python,python-asyncio,aiohttp,Python,Python Asyncio,Aiohttp,在使用aiohttp编写的web应用程序中,我有两个端点。首先是启动异步IO任务,这是一个无限循环。第二个计划是取消某些任务。由于asyncio任务没有任何id概念,我有点困惑。 是否可以在数据库中保存任务的某些标识符? 这是正确的方法还是lib已经为这类问题提供了解决方案 aiohttp_应用程序/views.py 谢谢你的帮助 您可以生成简单的单调递增的数字ID,并具有将ID映射到任务实例的全局dict。当协同路由完成时,映射将被删除。例如(未经测试): 然后您可以在开始任务和停止任务中使用
谢谢你的帮助 您可以生成简单的单调递增的数字ID,并具有将ID映射到任务实例的全局dict。当协同路由完成时,映射将被删除。例如(未经测试): 然后您可以在
开始任务
和停止任务
中使用它:
def start_task(request):
task_id, _ = make_task(coro)
response = {'task_id': task_id}
return web.json_response(json.dumps(response))
def stop_task(request):
task_id = json.loads(await request.text())['task_id']
task = get_task(task_id)
task.cancel()
response = {}
return web.json_response(json.dumps(response))
请添加代码,您已经添加了该代码,但triedI没有尝试任何代码。请说出你不明白的地方,你需要一个代码示例,我会给你我能提供的所有信息。请看,特别是帮助他人重现问题的部分。理想情况下,您应该提供设置两个(微不足道的!)端点的代码。在你们的情况下,这将帮助我们确切地了解你们是如何创建需要取消的任务的。谢谢你们帮助我提出更好的问题。我编辑了我的问题正文,并添加了一些代码示例,以显示我到底在哪里遇到了一些问题
import asyncio, itertools
_next_id = itertools.count().__next__
_tasks = {}
def make_task(corofn, *coroargs):
task_id = _next_id()
async def wrapped_coro():
try:
return await corofn(*coroargs)
finally:
del _tasks[task_id]
task = asyncio.create_task(wrapped_coro())
_tasks[task_id] = task
return task_id, task
def get_task(task_id):
return _tasks[task_id]
def start_task(request):
task_id, _ = make_task(coro)
response = {'task_id': task_id}
return web.json_response(json.dumps(response))
def stop_task(request):
task_id = json.loads(await request.text())['task_id']
task = get_task(task_id)
task.cancel()
response = {}
return web.json_response(json.dumps(response))