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

问题描述 投票:0回答:1

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

@app.route('/do', methods = ['POST'])
def do():
    # here download many picture, it will tasks long time, and block。
    return 'ok'
python flask block gunicorn gevent
1个回答
0
投票

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

要实现这一点,我将做两件事之一。

  1. 建立异步任务系统。我用了很多芹菜,但是还有其他选择。这样做的缺点是您通常需要另一部分基础架构-Redis,rabbitmq等。但这确实是最好的解决方案。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.