我在连接到公共数据库服务器的几个Web主机上运行Django。该数据库包含一个简单的待处理作业表。 e.g。
class Job(models.Model):
name = models.CharField(max_length=255, null=False, help_text='task to do')
worker = models.CharField(max_length=255, null=True, help_text='globally unique host name')
我如何使用Django的ORM查询待处理的作业(其中worker为null)并以原子方式设置工作者名称,因此没有两个Django进程会意外地获取相同的作业(即避免竞争条件)?
理想情况下,我只想在表锁中通过查询/更新进行换行,但Django的ORM似乎没有内置此功能。
答案 0 :(得分:2)
正如其他人所说,Celery将是最好的工具。如果您不想使用Celery:
如果您使用的是最新的Django,请使用select_for_update()查询您的作业,然后填写工作字段。那是Django ORM中你想要的“桌锁”。它只锁定受影响的行,因此通过允许更多的并发性,它比表锁更好。
如果您使用的是select_for_update()
不可用的旧版本,请实施“锁定表”(最简单的10行)以保护您的关键部分。