AIOHTTP:快速响应POST,但在后台处理其数据

问题描述:

我有一个ANPR(自动号牌读取)系统。基本上配置了几台相机。这些将HTTP POST发送到我们配置的位置。我们的问题鸡尾酒是这样的:AIOHTTP:快速响应POST,但在后台处理其数据

  • 我们的脚本需要将此数据发送到多个偶尔较慢的地方。
  • 相机在发布时锁定。

因此,如果我的脚本需要15秒才能完成 - 可以 - 我们可能会错过读取。

下面是我的脚本目前的削减版本。 3.4语法的道歉,我们现场有一些旧机器。

@asyncio.coroutine 
def handle_plate_read(request): 
    post_data = yield from request.post() 
    print(post_data) 

    # slow stuff! 

    return web.Response() 

app = web.Application() 
app.router.add_post('/', handle_plate_read) 
web.run_app(app, port=LISTEN_PORT) 

这是功能但我可以推回200到照相机的早期(和断开)和进行处理的数据,或以其它方式容易地推迟该步骤,直到相机连接的处理后?

如果我正确理解你的问题,你当然可以在响应后立即处理数据,或者稍后再处理它。

这里的解决方案是如何简单的可以关注一下:

  1. 而不是做慢的东西响应之前,具有无限的大小增加需要 数据做它的一些Queue并返回响应 imideately。

  2. 在后台运行一些Task来处理缓慢的作业, 从队列中抓取数据。任务本身与其他 协同并行运行,并且不会阻止它们。 (more info

  3. 由于“慢的东西”可能是一些与CPU相关的,你会 需要使用run_in_executorProcessPoolExecutor做 慢的东西,在其他工艺(ES)。 (more info

这应该在基本情况下工作。

但是你也应该考虑如何在重负载下工作。例如,如果您快速获取慢速数据的数据,但处理速度要慢得多,您的队列将增长,并且您将耗尽RAM。

在这种情况下,将数据存储在数据库中而非队列中是有意义的(您可能需要创建单独的任务以将数据存储在数据库中而不会阻止响应)。 asyncio具有很多DB的驱动程序,for example