如何锁定django命令进行单次运行。 Django的。 Python

问题描述:

如何锁定django命令,使它不会在同一时间运行?如何锁定django命令进行单次运行。 Django的。 Python

创建一个锁的地方 - 我最近看到使用的缓存非常简单的锁机制:

LOCK_EXPIRE = 60 * 5 

lock_id = "%s-lock-%s" % (self.name, id_hexdigest) #computed earlier 

is_locked = lambda: str(cache.get(lock_id)) == "true" 
acquire_lock = lambda: cache.set(lock_id, "true", LOCK_EXPIRE) 
release_lock = lambda: cache.set(lock_id, "nil", 1) 

if not is_locked(): 
    aquire_lock() 
    try: 
     #do something 
    finally: 
     release_lock() 

这只是许多可能的实现方式之一。

编辑:更正,我只是粘贴代码没有想到。 try...finally块用于确保始终释放锁,不管发生了什么 - 但当然if声明也是必要的。

+0

不对!它必须是尝试声明?或者我们需要检查is_locked = true? – Pol 2010-08-11 15:47:40

+0

@Pol你说得对,我修正了一个例子。 – cji 2010-08-11 16:46:14

有很多不同的方法来做到这一点。 cji的方法看起来好像工作得很好。我倾向于做的一件事是如果我的后台作业正在模型对象上运行,我使用状态字段来确定作业是否可以运行。

class BookModel(models.Model): 
    status_choices = ((1, 'new'), ('2', 'processed')) 
    name = models.CharField(max_length=12) 
    status = models.CharField(max_length=12, choices=status_choices) 

然后,如果我对这些书进行什么事情我可以做一些事情,像这样:

if book.status is 1: 
    ## do something