在 Flask 应用程序中使用 Gunicorn 和 Multiprocess

Using Gunicorn and Multiprocess with a Flask app

所以我正在尝试编写一个 Flask 应用程序,它有一个代码块 运行ning 每十分钟一次,下载并处理一个文件。我目前将该代码块触发到 运行 的方式是一个循环,该循环查看当前时间和最后一次代码块 运行 之间的时间差是否大于十分钟。多处理用于 运行 与 Flask 正在执行的循环同时进行,所有设置都在我的 Flask 应用程序的 if __name__ == "__main__": 部分中设置。

不幸的是,由于应用 运行 使用 Gunicorn(使用 Heroku 来 运行 应用),if __name__ == "__main__": 没有解析为 true 并且循环甚至没有开始。在 if True: 之类的设置中设置 Multiprocess 只会抛出错误,而 if __name__ =! "__main__": 则不会抛出任何错误,但会将 Flask 锁定在循环中,这意味着 Multiprocess 并没有真正按照预期进行。真的很好奇为什么会这样,但我更大的问题是是否有更好的方法 运行 我的代码块每十分钟一次,我仍然可以轻松地将代码的结果传递给 Flask 或让 Multiprocess 到运行 正确,您介意详细说明吗? Flask 内置的东西,可能类似于 @app.before_first_request,不需要外部触发器会很好。我觉得好像我忽略了一些非常简单的事情,结果我正在做的事情过于复杂。

我的代码的简化版本如下,在我的本地机器上没有被 Gunicorn 处理时可以工作:

import time
from flask import Flask, request, jsonify
from multiprocessing import Process, Value

app = Flask(__name__)

@app.route('/')
def webhook:
   respond_to_requests()

def record_loop(loop_on):
   while True:
      if loop_on.value == True:
         check_time_and_run_code()
   time.sleep(1)

if __name__ == "__main__":
   recording_on = Value('b', True)
   p = Process(target=record_loop, args=(recording_on,))
   p.start()
   app.run(debug=True, use_reloader=False)
   p.join()

我在 Heroku 上使用的 Procfile 运行 这个带有 Gunicorn 的应用程序包含 web: gunicorn app:app --log-file=-

在此先感谢您的帮助! :D

您似乎在网络进程中执行后台任务。 Web 进程旨在处理传入的请求。后台任务应该运行分开。

您可以定期使用 Heroku Scheduler or a custom clock process 到 运行 后台任务。