Flask应用程序在使用线程池时不起作用(使用UWSGI)

时间:2016-02-16 10:18:50

标签: python multithreading flask multiprocessing uwsgi

我使用多处理ThreadPools在Flask中实现多线程功能。

我的问题是,这是行不通的。当线程池被激活时,应用程序停止。

如果我重新启动UWSGI服务器,它无法正常杀死线程,因此在执行kill -9之前等待几分钟:

worker 1 (pid: 369) is taking too much time to die...NO MERCY !!!

谁能告诉我我做错了什么?

我的代码看起来像这样(简化了一下):

from multiprocessing.dummy import Pool as ThreadPool

    class BattleController():
        pool = None

        def __init__(self):
            self.pool = ThreadPool(2)

        def do_work(self, info):
            # This function is executed by a background thread.
            print info

        def start_async_work(self, info):
            self.pool.map(self.do_work, [info])

我的观点如下:

app = Flask(__name__)
controller = BattleController()

@app.route('/api/test', methods=['POST'])
def login():
    controller.start_async_work("Some info to process")
    return "everything worked", 200

2 个答案:

答案 0 :(得分:2)

Flask并非旨在支持您要执行的操作:http://flask.pocoo.org/docs/latest/design/#thread-locals

答案 1 :(得分:1)

对于未来的读者: 不可能做我正在尝试做的事情(正如Oin指出的那样),但我确实找到了另一种选择: Celery看起来像一个很好的Flask plug-in,可以启用后台任务。