- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 Python-RQ 创建一个工作,当你创建一个工作时,你会得到一个 job.id:
f311ae30-b623-4b38-9dcb-0edd0133a6e6
然后我用那个id来检查结果是否完成,这很棒。
然后将此结果缓存(500 秒)。
现在,这是我感到困惑的地方。
当另一个请求在 500 秒时间范围内使用相同的输入集时:
{'blah': u'123456', 'title': u' Some Title', 'variable': 123}
与创建另一个作业相比,我如何取回该作业的缓存结果。
我的问题是 job.id 是一些哈希值,包括时间戳等,所以我不确定如何在 Redis 中查找结果。
我到处搜索,但没有在任何地方看到有关在不创建新作业的情况下利用缓存结果的最佳方式的文档。
最佳答案
我想出了一个可能对其他人有帮助的解决方案。
基本上,创建输入的摘要(给 RQ 工作程序),以便我们可以在另一个相同的请求进入时查找一些内容,这将是哈希名称。键将是“job_key”,值将是我们需要的 job.id。
当另一个请求与之前处理过的请求相同时,我们现在可以找到并提供结果,而无需再次执行相同的工作。
此外,作为故障保险,为作业增加了一些额外的秒数,因此当缓存的 job.result 被另一个函数请求时,它仍然存在并且不会在两次调用之间被垃圾收集器删除。
*请求,如果有人有见识有没有更好的方法处理hash -> job.id(key, value) 内存消耗,类似于this和 this请告诉我。 (这两个链接指的是如何使用哈希与常规字符串以某种方式使用某种算法使每个哈希有 100 个键/值以某种方式使用更少的内存来存储键/值)。
关于好东西:
# Seconds before cached records expire
cache_expire = 500
# Create hash of parameters, to use as a lookup for job.id (cache)
hash = hashlib.sha1()
for param in search:
hash.update(str(search[param]))
url_hash = 'url:{0}'.format(hash.hexdigest())
# Check if we have a cached result, need old job_key
job_key = r.hget(url_hash, 'job_key')
if job_key:
job_hash = 'rq:job:{0}'.format(job_key)
ttl = r.ttl(job_hash)
if ttl:
# Add 30 more seconds of buffer room
# to ensure job.result doesn't get deleted pre-maturely
r.expire(job_hash, ttl+30)
return jsonify(search_id=job_key)
else:
# Job result has already been deleted, clear lookup hash
r.delete(url_hash)
# Create new job
job = q.enqueue_call(func=worker.search, args=(search,), result_ttl=cache_expire)
# Create job.id lookup using hash as key (for cache)
if r.hsetnx(url_hash, 'job_key', job.id):
r.expire(url_hash, cache_expire)
return jsonify(search_id=job.id)
关于python - 使用 Python-RQ 检查先前的结果是否已经存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15909733/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!