Heroku上的Redis队列和Flask应用程序保持超时

问题描述

您好,开发人员/同伴。

我正在开发一个聊天机器人,该聊天机器人使用自然语言处理(NLP)将文本转录到开始和结束位置。 它托管在Heroku上,我将Flask用于网络应用。 我必须通过调用GET / init路由(使用我最喜欢的浏览器)来初始化我的NLP。 这个初始化过程非常耗时,因此我决定将其放入Redis Queue工作器中。

我在这里遵循了本教程: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(定义dynos),我有:

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

当我继续/ init时,这是我从Web应用程序获得的响应:

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工作程序将继续执行init程序...。

开发人员,您对如何解决我的问题有想法吗? 谢谢您的未来帮助:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)