Flask Heroku上的Redis队列和烧瓶应用程序一直超时
各位开发人员/伙伴们好 我正在开发一个聊天机器人,它使用自然语言处理(NLP)将文本转录到起始和结束位置。 它托管在Heroku上,我使用Flask作为web应用程序。 我必须通过调用GET/init路由(使用我最喜欢的浏览器)初始化NLP。 这个初始化是一个非常耗时的过程,所以我决定将它放在Redis队列工作程序中 我在这里学习了本教程: 问题是:我在heroku上的web dyno总是超时,似乎我的init不是在worker dyno中启动的,而是在web dyno中启动的 所以我得到了我的app.py文件: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中启动的 所以我得到了我的
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,好吧,它解决了我的问题。我没有真正注意到这一点。谢谢你,伙计!