首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Heroku上的Redis队列和烧瓶应用程序一直在超时。

Heroku上的Redis队列和烧瓶应用程序一直在超时。
EN

Stack Overflow用户
提问于 2020-11-03 19:59:53
回答 1查看 555关注 0票数 0

你好,各位开发人员/同事。

我正在开发一个聊天机器人,它使用自然语言处理(NLP)将文本转录到一个开始和完成的地方。它是在Heroku上托管的,我使用的是用于网络应用的水瓶座。我必须通过调用GET /init路由(用我最喜欢的浏览器)插入我的NLP。这个init是一个非常耗时的过程,所以我决定将它放在Redis队列工作器中。

我在这里遵循了本教程:https://devcenter.heroku.com/articles/python-rq

问题是:我在heroku上的web dyno总是超时,似乎我的init并不是在工人dyno中启动的,而是与web dyno一起启动的。

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

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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),我有:

代码语言:javascript
复制
web: gunicorn app:app
worker: python -u worker.py

当我在/init上时,这是我从我的网络应用程序中得到的回应:

代码语言:javascript
复制
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

我应该得到一个初始化的聊天机器人!响应,在init进程中,redis工作人员继续工作.

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

EN

回答 1

Stack Overflow用户

发布于 2020-11-03 20:23:15

我认为你应该有q.enqueue(resetNlp, result_ttl=0, job_timeout=3600)。所以你传递一个要执行的函数。

但是,您要做的是对resetNlp()进行排队,它有效地执行此函数,显然需要足够的时间进行评估,从而超时您的HTTP请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64669773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档