【发布时间】:2014-08-03 13:25:15
【问题描述】:
考虑一个需要异步完成一些繁重工作的函数。调用客户端可以立即接收缓存版本,也可以接收正在处理数字的响应(客户端的有效响应)。
下面的 sn-p 是这种模式的合理实现吗?
from django.core import cache
from proj.celery import app
class SomeModel(models.Model):
# ...
def get_crunched_numbers(self):
cache_key = 'foo:{}'.format(self.id)
res = cache.get(cache_key)
if not res:
@app.task
def gen_crunched_numbers():
res = do_heavy_lifting()
cache.set(cache_key, res)
return res
gen_crunched_numbers.delay()
return 'crunching... come back later'
else:
return res
有没有更好的替代方案来运行像这样的 Celery 任务,同时将所有逻辑包含在单个代码中?
编辑:如 cmets 中所述,此代码甚至不起作用。所以任何关于一个好的模式的建议都是非常有义务的。
【问题讨论】:
-
这真的有效吗?如果可以序列化这样的嵌套函数,我会感到惊讶。将
cache_key作为一个完全独立函数的参数肯定要好得多。 -
@DanielRoseman 你是对的,这只能在本地工作(使用
ALWAYS_EAGER=True 时)并且完全不可序列化。