所以,基本上我想构建一个在heroku上使用RQ的长轮询应用程序。我看过这个问题Flask: passing around background worker job (rq, redis),但没有用。
这基本上就是我正在做的事情。
@app.route('/do_something', methods=['POST'])
def get_keywords():
data_json = json.loads(request.data)
text = urllib.unquote(data_json["sentence"])
job = q.enqueue(keyword_extraction.extract, text)
return job.key
@app.route('/do_something/<job_id>', methods=['GET'])
def get_keywords_results(job_id):
job = Job().fetch(job_id)
if(not job.is_finished):
return "Not yet", 202
else:
return str(job.result)
没有什么是花哨的,所以当POST请求到来时,它将对作业进行排队并将job_id立即返回给用户,然后用户将使用该键继续轮询结果。但是,由于此行Job().fetch(job_id)
返回
NoRedisConnectionException: Could not resolve a Redis connection.
任何帮助都会非常感激。
答案 0 :(得分:15)
我已经发现了这一点,万一有人感兴趣。它必须是这一个。
Job.fetch(job_id, connection=conn)
答案 1 :(得分:1)
在运行时发现的RQ版本0.13.0
中:
j = q.enqueue(job_func)
j.key
将是rq:job:
之前的键。
因此,在获取我需要使用的作业时,框架中的其他位置:
j = q.fetch_job(key[7:])
j.result
将为None
或返回值job_func
的地方。
不确定是否有更好的方法来解决这个问题...
答案 2 :(得分:0)
这是由于回归现已修复,详见https://github.com/nvie/rq/issues/479。
您需要从github master分支安装才能解决此问题,直到将其发布到PyPI。