如何在 Heroku 中运行后台任务? [英] How to run a background task in Heroku?
问题描述
我已经构建了一个 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 文档.所以我按照 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 something
Web 请求创建线程的一个实例,并可以通知调用者正在进行某些操作(或应用不同的工作流/消息)
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 中运行后台任务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!