【问题标题】:Using Gunicorn and Multiprocess with a Flask app将 Gunicorn 和 Multiprocess 与 Flask 应用程序一起使用
【发布时间】:2018-02-08 07:40:38
【问题描述】:

所以我正在尝试编写一个 Flask 应用程序,该应用程序有一段代码每十分钟运行一次,拉下并处理一个文件。我目前触发该代码块运行的方式是一个循环,查看当前时间与代码块上次运行时间之间的差值是否大于十分钟。多处理用于与 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 上使用 Gunicorn 运行此应用的 Procfile 包含 web: gunicorn app:app --log-file=-

提前感谢您的帮助! :D

【问题讨论】:

  • 似乎没有任何理由在与 Web 应用程序相同的进程中运行它。单独运行并通过 cron 之类的方式进行管理; gunicorn 根本不需要参与。

标签: python heroku flask gunicorn multiprocess


【解决方案1】:

您似乎在 Web 进程中执行后台任务。 Web 进程旨在处理传入的请求。后台任务应单独运行。

您可以使用Heroku Schedulercustom clock process 定期运行后台任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2021-08-29
    • 2022-01-15
    • 2018-05-26
    • 2018-07-05
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多