如何在 Heroku 中运行后台任务? [英] How to run a background task in Heroku?

查看:33
本文介绍了如何在 Heroku 中运行后台任务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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())

我还在Procfilerequirements.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆