使用Gunicorn和Multiprocess处理Flask应用程序

4

我希望写一个Flask应用程序,每十分钟运行一次代码块来下载和处理文件。目前触发代码块的运行的方式是循环查看当前时间和上一次代码块运行时间之间的差是否大于十分钟。在我的Flask应用程序的if __name__ == "__main__":部分设置Multiprocessing以与Flask同时运行这个循环。

不幸的是,由于使用Gunicorn(使用Heroku运行应用程序),if __name__ == "__main__":不能被识别为真,并且循环甚至不会开始。在类似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


似乎没有必要将这个程序和网络应用放在同一个进程中运行。可以使用类似cron的工具单独运行它,并进行管理;根本不需要涉及gunicorn。 - Daniel Roseman
1个回答

0
你似乎在网络进程中执行后台任务。网络进程旨在处理传入的请求。后台任务应该单独运行。
您可以使用Heroku Scheduler自定义时钟进程以定期间隔运行后台任务。

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