所以我试着编写一个Flask应用程序,每十分钟运行一次代码块,下拉并处理一个文件。我当前触发该代码块运行的方式是一个循环,它查看当前时间与上次运行代码块之间的差值是否大于十分钟。多处理用于与Flask正在进行的操作同时运行循环,所有这些都在我的Flask应用程序的if __name__ == "__main__":
部分中设置。
不幸的是,由于应用程序是使用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在Procicorn上运行此应用程序的Procfile包含web: gunicorn app:app --log-file=-
提前感谢您的帮助! :d
答案 0 :(得分:0)
您似乎在Web进程中执行后台任务。 Web进程旨在处理传入的请求。后台任务应该单独运行。
您可以使用Heroku Scheduler或custom clock process定期运行后台任务。