Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask Heroku上的Redis队列和烧瓶应用程序一直超时_Flask_Heroku_Redis_Chatbot_Dyno - Fatal编程技术网

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

Flask Heroku上的Redis队列和烧瓶应用程序一直超时,flask,heroku,redis,chatbot,dyno,Flask,Heroku,Redis,Chatbot,Dyno,各位开发人员/伙伴们好 我正在开发一个聊天机器人,它使用自然语言处理(NLP)将文本转录到起始和结束位置。 它托管在Heroku上,我使用Flask作为web应用程序。 我必须通过调用GET/init路由(使用我最喜欢的浏览器)初始化NLP。 这个初始化是一个非常耗时的过程,所以我决定将它放在Redis队列工作程序中 我在这里学习了本教程: 问题是:我在heroku上的web dyno总是超时,似乎我的init不是在worker dyno中启动的,而是在web dyno中启动的 所以我得到了我的

各位开发人员/伙伴们好

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

我在这里学习了本教程:

问题是:我在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 !'
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()
这是我的worker.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 !'
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
我应该得到一个聊天机器人初始化响应,redis worker在初始化过程中继续运行

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

我想您应该有
q.enqueue(resetNlp,result\u ttl=0,job\u timeout=3600)
。因此,您传递了一个将要执行的函数。

但您要做的是将
resetNlp()
排入队列,这有效地执行了这个函数,显然需要足够的时间来计算,以超时您的HTTP请求。

ahahah,好吧,它解决了我的问题。我没有真正注意到这一点。谢谢你,伙计!