【问题标题】:Using Django ORM as a multi-process lock across hosts使用 Django ORM 作为跨主机的多进程锁
【发布时间】:2012-05-28 03:59:49
【问题描述】:

我在连接到一个公共数据库服务器的几个 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 为空)并自动设置工作者名称,因此不会有两个 Django 进程意外地获取同一个作业(即避免竞争条件)?

理想情况下,我只想通过查询/更新在表锁中进行包装,但 Django 的 ORM 似乎没有内置此功能。

【问题讨论】:

  • 您是否考虑过使用 Celery 进行这种分布式任务管理,而不是尝试自己构建它?
  • @DanielRoseman,是的。我目前正在使用 Celery 执行许多任务,但我不太关心它。

标签: python django django-orm


【解决方案1】:

正如其他人所提到的,Celery 将是最好的工具。如果你不想使用 Celery:

  • 如果您使用的是最新的 Django,请使用 select_for_update() 查询您的 Job,然后填写 worker 字段。这就是你在 Django ORM 中想要的“表锁”。它只锁定受影响的行,因此它比表锁定更好,因为它允许更多的并发性。

  • 如果您使用的是旧版本,其中 select_for_update() 不可用,请实施“锁定表”(只需 10 行)以保护您的关键部分。

【讨论】:

  • 郑重声明,Celery 不支持开箱即用。您需要使用自定义函数装饰器和内存缓存来使用 Celery 获得此功能。
猜你喜欢
  • 2015-10-29
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多