Skip to main content
 首页 » 编程设计

python之在@staticmethod 中避免django QuerySet 缓存

2024年09月03日31dflying

<分区>

以下几行代码说明了我用来处理数据的分布式工作器模型。作业正在数据库中创建,它们的数据进入大驱动器,一旦所有信息可用,作业状态将设置为“等待”。从这里开始,多个活跃的工作人员开始发挥作用:他们中的每一个不时发出一个查询,在其中它试图“认领”一份工作。为了同步声明,查询被封装到一个事务中,如果查询返回一个候选人,该事务会立即更改作业状态。到目前为止一切顺利。

问题是 claim 的调用只在第一次有效。阅读 QuerySets 及其缓存行为,在我看来,静态方法和 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 不会在静态方法的不同调用中缓存其结果?还是我错过了什么而追逐幻影?任何帮助将不胜感激...谢谢!