【发布时间】:2011-05-12 22:40:09
【问题描述】:
以下几行代码说明了我用来处理数据的分布式工作器模型。作业正在数据库中创建,它们的数据进入大驱动器,一旦所有信息可用,作业状态将设置为“等待”。从这里开始,多个活跃的工人开始发挥作用:他们每个人都不时发出一个查询,在其中它试图“声称”一份工作。为了同步声明,查询被封装到一个事务中,如果查询返回一个候选人,该事务会立即更改作业状态。到目前为止一切顺利。
问题是声明调用仅在第一次有效。阅读 QuerySet 及其缓存行为,在我看来,将静态方法和 QuerySet 缓存结合起来总是依赖于缓存......请自行查看:
我有一个派生自 django.db.models.Model 的类:
class Job(models.Model):
[...]
我在其中定义了以下静态函数。
@staticmethod
@transaction.commit_on_success
def claim():
# select the oldest, top priority job and
# update its record
jobs = Job.objects.filter(state__exact = 'WAITING').order_by('-priority', 'create_timestamp')
if jobs.count() > 0:
j = jobs[0]
j.state = 'CLAIMED'
j.save()
logger.info('Job::claim: claimed %s' % j.name)
return j
return None
我做错了什么明显的事情吗?有什么更好的方法来处理这个问题?如何确保 QuerySet 不会在静态方法的不同调用中缓存其结果?还是我错过了什么并追逐幻影?任何帮助将不胜感激...谢谢!
【问题讨论】:
标签: python django django-models