运行 Flask with Gunicorn 和 Gevent 时如何使用 requests 发出非阻塞请求

how to make a non-blocking request with requests when running Flask with Gunicorn and Gevent

我的 Flask 应用程序将收到一个请求,进行一些处理,处理需要很长时间。 运行 Gunicorn with Gevent 将允许它同时处理许多这些缓慢的请求。我知道当我的应用程序处理这个请求时,它也可以处理其他请求,但我的目的是在这个请求中它可以快速响应客户端并仍然在后台处理图像下载。 我怎样才能修改下面的例子,使视图是非阻塞的?

@app.route('/do', methods = ['POST'])
def do():
    # here download many picture, it will tasks long time, and block。
    return 'ok'

Flask + gevent 不是执行此操作的正确工具。 Gevent 使用猴子修补 运行 事件循环中的常规代码 - 但在此过程中,您无法 运行 常规事件循环内容(例如安排异步任务)。我不是 gevent 专家(所以也许有我不知道的技术),但我不这么认为。

为此,我会做以下两件事之一。

  1. 设置异步任务系统。我用过很多芹菜,但还有其他选择。这样做的缺点是您通常需要另一个基础设施——Redis、rabbitmq 等。不过,这确实是最好的解决方案。

  2. 使用明确的异步网络框架。我为此使用 Sanic。它使您可以直接从视图中安排协程,以便即使在视图协程完成后它们也可以继续 运行。这意味着您的所有代码都必须是异步的,这是一个学习曲线。

有一个不太好的解决方案是使用线程或多处理来开始您的工作并且没有任何监控它来进行清理。最后,uwsgi 内置了一些用于后台任务的东西,虽然我还没有尝试过。