Python 如何在Heroku中运行后台任务?

Python 如何在Heroku中运行后台任务?,python,selenium-webdriver,heroku,request,background-process,Python,Selenium Webdriver,Heroku,Request,Background Process,我已经构建了一个python应用程序,并使用Flask和python部署了它。这是我的代码的骨架 #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-ps

我已经构建了一个python应用程序,并使用
Flask
python
部署了它。这是我的代码的骨架

#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的说法,有时响应需要30秒以上,这意味着H12错误。所以我按照教程运行后台作业。 这是我到目前为止所做的

#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秒以上的时间。任何能在这方面帮助我的人?

一个解决方案是从web请求生成一个线程:在这种情况下,当后台线程启动并执行必要的任务时(不受HTTP超时的限制),可以立即返回响应(几乎)

web请求创建线程的一个实例,并可能通知调用方正在进行某些操作(或应用不同的工作流/消息)


一个解决方案是从web请求中生成一个线程:在这种情况下,当后台线程启动并执行必要的任务时(几乎)可以立即返回响应(不受HTTP超时的限制)

web请求创建线程的一个实例,并可能通知调用方正在进行某些操作(或应用不同的工作流/消息)


web worker节点的想法是web Dyno接收请求,将条目存储在队列中(本例中为redis),以便worker可以拾取并处理它。抱歉,我没有代码示例可供分享如果您感兴趣,我可以发布另一个解决方案:从请求中跨出一个新线程,在后台处理密码重置请求(无需工作节点)。如果这是您处理传入请求的方式,那么worker是有意义的(而且更优雅)。对于单个用例,生成线程可能是simpler@BeppeC如果您可以发布对我非常有帮助的解决方案,那么web worker节点的想法是web Dyno接收请求,将条目存储在队列中(本例中为redis),以便worker可以拾取并处理它。抱歉,我没有代码示例可供分享如果您感兴趣,我可以发布另一个解决方案:从请求中跨出一个新线程,在后台处理密码重置请求(无需工作节点)。如果这是您处理传入请求的方式,那么worker是有意义的(而且更优雅)。对于单个用例,生成线程可能是simpler@BeppeC如果你可以张贴解决方案,这将是非常有帮助的我
# 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
#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"