如何锁定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
声明也是必要的。
答
有很多不同的方法来做到这一点。 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
不对!它必须是尝试声明?或者我们需要检查is_locked = true? – Pol 2010-08-11 15:47:40
@Pol你说得对,我修正了一个例子。 – cji 2010-08-11 16:46:14