使用Flaic应用程序使用Gunicorn和Multiprocess

时间:2018-02-08 07:40:39

标签: python heroku flask gunicorn multiprocess

所以我试着编写一个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

1 个答案:

答案 0 :(得分:0)

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

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