我希望写一个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