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

时间:2017-06-12 11:35:02

标签: python python-asyncio aiohttp

我有一个ANPR(自动车牌阅读)系统。基本上配置了一些相机。这些使HTTP 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 个答案:

答案 0 :(得分:2)

如果我正确地理解了您的问题,您当然可以在回复后立即处理数据,或者稍后处理数据。

这里有一个简单的解决方案:

  1. 在响应之前不要做慢速的事情,而是添加所需的数据 对具有无限大小和返回响应的某些Queue执行此操作 imideately。

  2. 在后台运行一些Task以处理缓慢的工作 从队列中获取数据。任务本身与其他任务并行运行 协程并没有阻止它们。 (more info

  3. 因为"缓慢的东西"你可能会与CPU有关 需要run_in_executorasyncio一起使用 在其他过程中缓慢的东西。 (more info

  4. 这应该适用于基本情况。

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

    在这种情况下,将数据存储在除队列之外的数据库中是有意义的(您可能需要创建单独的任务来将数据存储在数据库中而不会阻止响应)。 TEMPARRAY=( "1 A" "2 B" ) 包含许多数据库for example的驱动程序。