【问题标题】:Multiprocess within flask app spinning up 2 processes烧瓶应用程序中的多进程启动 2 个进程
【发布时间】:2016-02-28 21:34:09
【问题描述】:

我正在构建一个烧瓶应用程序,需要一些后台进程来运行。我决定使用多进程,但它在 Flask 中运行时会产生两个进程。有谁知道为什么会发生这种情况?我已经在 OS X 和 Ubuntu 12.04 上对其进行了测试,结果相同。这是一个例子:

import time
import multiprocessing
from flask import Flask

app = Flask(__name__)
backProc = None

def testFun():
    print('Starting')
    while True:
        time.sleep(3)
        print('looping')
        time.sleep(3)
        print('3 Seconds Later')

@app.route('/')
def root():

    return 'Started a background process with PID ' + str(backProc.pid) + " is running: " + str(backProc.is_alive())

@app.route('/kill')
def kill():
    backProc.terminate()
    return 'killed: ' + str(backProc.pid)

@app.route('/kill_all')
def kill_all():
    proc = multiprocessing.active_children()
    for p in proc:
        p.terminate()
    return 'killed all'

@app.route('/active')
def active():
    proc = multiprocessing.active_children()
    arr = []
    for p in proc:
        print(p.pid)
        arr.append(p.pid)

    return str(arr)

@app.route('/start')
def start():
    global backProc
    backProc = multiprocessing.Process(target=testFun, args=(), daemon=True)
    backProc.start()
    return 'started: ' + str(backProc.pid)

if __name__ == '__main__':
    app.run(port=int("7879"))

【问题讨论】:

  • 我想使用 python 2.7.x 使进程与作为守护进程运行的进程异步。问题是在进程完成运行之前不会发生端点中的返回,即使 daemon 设置为 True。我在 uWSGI 上运行它,也许这就是原因。

标签: python flask multiprocessing python-multiprocessing


【解决方案1】:

这是 Flask 自动重新加载功能的问题,该功能在开发过程中用于在检测到代码更改时自动重新启动网络服务器,以便在无需手动重新启动的情况下提供新代码。

在指南中,“app.run()” 调用始终放在“if __name__ == ‘__main__’” 条件内,因为默认情况下重新加载器设置为打开。当使用多处理时,这种情况会导致错误,所以你必须在这样的函数中使用它时禁用 Flask 自动重载:

def startWebserver():
          app.run(debug=True, use_reloader=False)

参考链接:

http://blog.davidvassallo.me/2013/10/23/nugget-post-python-flask-framework-and-multiprocessing/

【讨论】:

  • 太棒了,这行得通。谢谢,我用那个头撞墙了
  • 请注意,使用 apache/mod_wsgi 部署 Flask 应用程序,使用多处理根本不起作用或非常不可靠。最好使用 Celery、Huey 或 Rq 等任务队列。
  • @jjmurre:你对 Apache 有什么问题?我正计划在 apache 上部署我的烧瓶应用程序与多处理。
  • @jjmurre 您是否尝试在 apache 上部署?你有问题吗?
  • @JuanPerez 使用多进程使用 mod_wsgi 部署 Flask 不是问题。在我对 17 年 9 月 12 日的评论中,我指的是 python 多处理模块,而不是 mod_wsgi。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2019-06-26
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多