python – 使用Django ORM作为跨主机的多进程锁

我在连接到公共数据库服务器的几个Web主机上运行Django.该数据库包含一个简单的待处理作业表.例如

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似乎没有内置此功能.

最佳答案 正如其他人所提到的,Celery将是最好的工具.如果您不想使用Celery:

>如果您使用的是最新的Django,请使用select_for_update()查询您的作业,然后填写工作字段.那是Django ORM中你想要的“桌锁”.它只锁定受影响的行,因此通过允许更多的并发性,它比表锁更好.
>如果您使用的是旧版本,其中select_for_update()不可用,请实施“锁定表”(简单为10行)以保护您的关键部分.

点赞