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

我有一个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. 与其在响应之前进行缓慢的工作,不如将其所需的数据添加到大小不受限制的Queue中 ,并立即返回响应。

  2. 在后台运行一些任务以处理缓慢的作业,该作业将从队列中获取数据。 Task本身与其他协程并行运行,并且不会阻止它们。 更多信息

  3. 由于“慢速处理”可能与CPU相关,因此您需要将run_in_executorProcessPoolExecutor一起使用,以在其他进程中进行慢速处理。 更多信息

这在基本情况下应该有效。

但是,您还应该考虑它在重负载下如何工作。 例如,如果您快速地为慢速的东西获取数据,但是处理得慢得多,则队列将增长,并且将耗尽RAM。

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

转载请注明来自askonline.tech,本文标题:python - AIOHTTP:快速响应POST,但在后台处理其数据


 Top