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

Python 使用Gunicorn和Gevent运行Flask时,如何使用请求发出非阻塞请求,python,flask,block,gunicorn,gevent,Python,Flask,Block,Gunicorn,Gevent,我的烧瓶申请会收到一个请求,做一些处理,处理时间很长。使用Gevent运行Gunicorn将允许它同时处理许多这样缓慢的请求。我知道当我的应用程序处理这个请求时,它也可以处理其他请求,但我的目的是,在这个请求中,它可以快速响应客户端,并且仍然在后台处理图像下载 如何修改下面的示例,使视图不被阻塞 @app.route('/do', methods = ['POST']) def do(): # here download many picture, it will tasks long

我的烧瓶申请会收到一个请求,做一些处理,处理时间很长。使用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使用monkey补丁在事件循环上运行常规代码——但在此过程中,您无法运行常规事件循环(如调度异步任务)。我不是gevent专家(所以可能有一种技术我不知道),但我不这么认为

为了实现这一点,我将做两件事中的一件

  • 设置异步任务系统。我已经用了很多芹菜,但还有其他的选择。这样做的缺点是,您通常需要另一个基础架构—Redis、rabbitmq之类的东西。但这确实是最好的解决方案

  • 使用显式异步web框架。我用Sanic来做这个。它允许您直接从视图调度协同路由,这样即使在视图协同路由完成后,它们也可以继续运行。这意味着所有代码都必须是异步的,这是一条学习曲线


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

    非常感谢您的回答。我觉得用芹菜有点笨重,就像下载10多张图片一样。使用芹菜需要启动一个单独的服务和额外的维护。我刚刚了解了Sanic框架,它是一个很好的框架,但我现在已经在Flask中编写了很多业务代码,似乎我现在处于进退两难的境地,如果业务逻辑还不是异步的,无论如何,你都无法从gevent中获得最大的好处:)如果你的应用程序必须扩展到多个实例,那就咬紧牙关,运行Redis服务器并添加芹菜。我保证这比你为了避免它而跳出的圈圈要少。