我有一个很长的任务,进入python-rq工作队列。
@cache.cached(timeout=2592000)
@app.route('/as/<keyword>', methods=['GET'])
@db_session
def auto_suggest(keyword):
job = q.enqueue(find_keyword, keyword)
while not job:
time.sleep(1)
return jsonify(word=job)
我使用flask-cache
尝试将结果保存为最多只需要每周运行一次的计算,每月一次就足够了。
我遇到的问题是,当它运行时,它会缓存失败的响应,而不是实际的解决方案。
还有其他办法吗?或者建议如何处理这个问题?
答案 0 :(得分:2)
您正在尝试对Job
代理对象进行JSON编码,而不是作业的结果。您确实想在此处检查作业结果:
job = q.enqueue(find_keyword, keyword)
while not job.result:
time.sleep(1)
return jsonify(word=job.result)
这应该缓存得很好。
您可以使用Cache.memoize()
decorator来记住find_keyword
函数的结果:
@cache.memoize(30 * 24 * 60 * 60)
def find_keyword(keyword):
# ....
这将基于find_keyword()
参数缓存keyword
函数的结果一个月(不同关键字的结果将独立缓存)。
还有一点需要注意:当将额外的装饰器应用于视图函数时,请确保将@app.route()
装饰器放在顶部(最后应用)。任何“稍后”应用的装饰器都会被忽略,因为它们的输出不是被注册为视图:
@app.route('/as/<keyword>', methods=['GET'])
@cache.cached(timeout=2592000)
@db_session
def auto_suggest(keyword):
job = q.enqueue(find_keyword, keyword)
while not job.result:
time.sleep(1)
return jsonify(word=job.result)