Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从视图中的异步IO事件循环中获取任务?_Python_Python Asyncio_Aiohttp - Fatal编程技术网

Python 如何从视图中的异步IO事件循环中获取任务?

Python 如何从视图中的异步IO事件循环中获取任务?,python,python-asyncio,aiohttp,Python,Python Asyncio,Aiohttp,在使用aiohttp编写的web应用程序中,我有两个端点。首先是启动异步IO任务,这是一个无限循环。第二个计划是取消某些任务。由于asyncio任务没有任何id概念,我有点困惑。 是否可以在数据库中保存任务的某些标识符? 这是正确的方法还是lib已经为这类问题提供了解决方案 aiohttp_应用程序/views.py 谢谢你的帮助 您可以生成简单的单调递增的数字ID,并具有将ID映射到任务实例的全局dict。当协同路由完成时,映射将被删除。例如(未经测试): 然后您可以在开始任务和停止任务中使用

在使用aiohttp编写的web应用程序中,我有两个端点。首先是启动异步IO任务,这是一个无限循环。第二个计划是取消某些任务。由于asyncio任务没有任何id概念,我有点困惑。 是否可以在数据库中保存任务的某些标识符? 这是正确的方法还是lib已经为这类问题提供了解决方案

aiohttp_应用程序/views.py
谢谢你的帮助

您可以生成简单的单调递增的数字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))