繁体   English   中英

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

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

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

@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. 使用显式异步 Web 框架。 我为此使用 Sanic。 它让您可以直接从视图中调度协程,以便即使在视图协程完成后它们也可以继续运行。 这意味着您的所有代码都必须是异步的,这是一个学习曲线。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM