Flask中的Python多进程处理

37

这个问题可能已经被问过,很可能也有答案,但是我不知道在哪里找到它。

问题:我有一个用于Python Flask的路由器,每次调用处理数据需要一段时间。我需要使每个路由器调用成为一个线程,这样它就不必等待请求加载。


你想为单个请求使用多线程吗?还是每个请求都是独立的进程/线程? - Brendan Abel
每个请求应该是一个单独的线程。 - Corbbin Goldsmith
我会接受将重定向到现有线程作为答案。 - Corbbin Goldsmith
3个回答

23
Flask内置了一个开发用的Web服务器,但是在生产环境中不应该使用它
为了获得像单独的进程用于每个请求和静态文件服务等酷炫功能,您需要在Flask应用程序前运行一个实际的Web服务和WSGI服务。 Flask文档提供若干示例来设置这些内容。流行的Web服务器/WSGI组合有Apache/mod_wsgi和Nginx/Gunicorn,但还有许多其他选择。

6

正如其他人所提到的,有专门的工具来完成这个任务(celery 似乎是最好的选择),但如果有人只想快速设置并运行一些东西,这里是我使用 Python 的 multiprocessing 模块的方法:

from flask import Flask
from multiprocessing import Process
import time

app = Flask(__name__)

def detachedProcessFunction(wait_time):
    i=0
    while i<wait_time:
        i = i+1
        print "loop running %d" % i
        time.sleep(1)

@app.route('/start')
def start():
    global p
    p = Process(target=detachedProcessFunction, args=(15))
    p.start()
    return render_template('layout.html')

if __name__ == '__main__':
    app.run(debug=True)

注意:此方法无法用于运行对象函数(例如obj.objFunc())。您将收到一个EOFError: Ran out of input inside a class。在这种情况下,您应该在非对象/独立函数中创建对象,并传递您需要创建对象的参数。有关更多信息,请参见此处


1
使用这个方法,似乎 Flask 应用程序在那 15 秒的超时期间仍然不可用。@DankMasterDan - Uddhav Mishra
@Uddhav,您所指的超时时间段是什么?我没有看到任何Flask应用程序不可用的时间。 - DankMasterDan
1
它是阻塞的。该应用程序将不可用。 - johnnyX

5
一种非常好的设置方法是将“uwsgi”作为应用程序服务器(和协议)以及Nginx作为前端代理。这些都是超级快速、可扩展的,能够处理线程,并且这是Flask推荐的方法之一。虽然flask文档提供了基本配置,但我使用的是这个指南,它提供了更深入的安装步骤。他们在使用Ubuntu,但对于大多数Linux版本,只需进行少量更改(安装命令)即可。
链接:https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-14-04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接