我已经构建了一个 python 应用程序并使用 Flask 和 Python 部署它.这是我的代码骨架.
I have already build a a python app and deployed it using Flask and Python. Here is my Skelton of my code.
#app.py @app.route('/', methods=['GET']) def login(): '''login process''' @app.route('/reset-password', methods=['GET']) def reset_password(): '''reset password process''' @app.route('/add-psa', methods=['GET']) def add_user(): '''add user process''' if __name__ == '__main__': app.debug = True app.run(use_reloader=False, threaded=True)已部署的应用程序在 Heroku 中运行良好.但有时根据 Heroku H12 错误" rel="nofollow noreferrer">文档.所以我按照 this 教程运行后台作业.这是我到目前为止所做的
Deployed app work fine in the Heroku. But sometime it takes more than 30 seconds to response which means H12 error according to Heroku doc. So I followed this tutorial to run background job. Here is what I've done so far
#worker.py import os import redis from rq import Worker, Queue, Connection listen = ['high', 'default', 'low'] redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379') conn = redis.from_url(redis_url) if __name__ == '__main__': with Connection(conn): worker = Worker(map(Queue, listen)) worker.work()下一步...
#utils.py import requests def count_words_at_url(url): resp = requests.get(url) return len(resp.text.split())我还在Procfile 和requirements.txt
我想在后台运行我的 reset_password(),因为它需要超过 30 秒.谁能帮我解决这个问题?
I want to run my reset_password() in background since its taking more than 30seconds. Any one who can help me on this?
推荐答案一个解决方案是从 web 请求中产生一个线程:在这种情况下,响应可以(几乎)立即返回,而后台线程启动并执行必要的任务(没有HTTP超时的限制)
A solution is to spawn a thread from the web request: in this case the response can be returned (almost) immediately while a background thread starts and performs the necessary task (without the constraint of the HTTP timeout)
# my background thread class MyWorker(): def __init__(self, message): self.message = message thread = threading.Thread(target=self.run, args=()) thread.daemon = True thread.start() def run(self): logging.info(f'run MyWorker with parameter {self.message}') # do somethingWeb 请求创建线程的一个实例,并可以通知调用者正在进行某些操作(或应用不同的工作流/消息)
The web request creates an instance of the thread and could inform the caller something is in progress (or apply a different workflow/message)
#app.py @app.route('/reset-password', methods=['GET']) def reset_password(): '''reset password process''' MyWorker('param_value') return "In progress... You will receive an email"更多推荐
如何在 Heroku 中运行后台任务?
发布评论