【问题标题】:Redis Queue and Flask app on Heroku keeps timing outHeroku 上的 Redis Queue 和 Flask 应用程序不断超时
【发布时间】:2021-02-16 12:57:30
【问题描述】:

各位开发者/伙伴您好。

我正在开发一个聊天机器人,它使用自然语言处理 (NLP) 将文本转录到起点和终点。 它托管在 Heroku 上,我将 Flask 用于 Web 应用程序。 我必须通过调用 GET /init 路由(使用我最喜欢的浏览器)来初始化我的 NLP。 这个初始化是一个非常耗时的过程,所以我决定把它放在一个 Redis Queue worker 中。

我在这里学习了这个教程:https://devcenter.heroku.com/articles/python-rq

问题是:我在 heroku 上的 web dyno 总是超时,似乎我的 init 没有在 worker dyno 中启动,而是在 web dyno 中启动。

所以我有我的 app.py 文件:

from naturalLanguageProcessing import Nlp
from rq import Queue
from worker import conn
import redis
from flask import Flask
from flask import request
from flask import abort

app = Flask(__name__)

""" Reset the NLP - delete the model & train it again - THIS IS THE TIME CONSUMING FUNCTION """
def resetNlp():
  NLP = Nlp()
  NLP.reset()
  NLP.train()

""" Init chatbot, IA, and others stuff """
@app.route('/init', methods=['GET'])
def init_entry():
  # Create redis queue
  q = Queue(connection=conn)

  # Queue reset nlp
  q.enqueue(resetNlp(), result_ttl=0, job_timeout=3600)

  return 'Chatbot initialized !'

这是我的 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):
    print('Launching redis worker...')
    worker = Worker(map(Queue, listen))
    worker.work()

对于我的 Procfile(定义测功机),我有:

web: gunicorn app:app
worker: python -u worker.py

当我继续 /init 时,这是我从我的网络应用程序得到的响应:

heroku[router] error at=error code=H12 desc="Request timeout" method=GET path="/init" request_id=XXXXXXXXXXXXXXXXXXX fwd="xx.xxxx.xxxxx.xx" dyno=web.1 connect=2ms service=30001ms status=503 bytes=0 protocol=https
app[web] CRITICAL [2020-11-03 19:37:38 +0000] [4] [CRITICAL] WORKER TIMEOUT (pid:18)
app[web] INFO [2020-11-03 19:37:38 +0000] [18] [INFO] Worker exiting (pid: 18)
app[web] INFO [2020-11-03 19:37:38 +0000] [32] [INFO] Booting worker with pid: 32

我应该只是得到一个 Chatbot 已初始化! 响应,redis worker 继续在 init 进程中运行......

开发者伙伴们,您是否有关于如何解决我的问题的想法? 感谢您对未来的帮助:)

【问题讨论】:

    标签: flask heroku redis chatbot dyno


    【解决方案1】:

    我认为你应该有q.enqueue(resetNlp, result_ttl=0, job_timeout=3600)。因此,您传递了一个将要执行的函数。
    但是你要做的是让resetNlp() 入队,它正在有效地执行这个函数,这显然需要足够的时间来评估,以使你的 HTTP 请求超时。

    【讨论】:

    • 啊哈,好吧,它解决了我的问题。我并没有真正注意这个小点。谢谢你的伙伴!
    猜你喜欢
    • 2018-10-21
    • 2022-01-05
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多