微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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程序...。

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

解决方法

我认为您应该有q.enqueue(resetNlp,result_ttl=0,job_timeout=3600)。因此,您传递了将要执行的功能。
但是您要做的是让resetNlp()入队,它有效地执行了此功能,显然需要足够的时间进行评估,从而使HTTP请求超时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。