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

标签 python django django-orm

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

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

最佳答案

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

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

  • 如果您使用的是 select_for_update() 不可用的旧版本,请实现“锁定表”(简单至 10 行)以保护您的关键部分。

关于python - 使用 Django ORM 作为跨主机的多进程锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688859/

相关文章:

python - 如何将整数从任何基数转换为任何其他基数?

python - 仅使用 OpenCV 检测图像中的虚线(断线)

python - Pandas 按列分组并转换为键 :value pair

django - 使用collectstatic编辑Amazon S3上的文件

python - 移动 python 包而不弄乱内部导入

python - Django Rest 框架 JWT "Authentication credentials were not provided."}

python-3.x - 使用重定向从表单保存后如何通过 id 传递对象?

django - 连接 __contains 和 __in 的最简单方法是什么?

python - 在Django中,我可以在创建对象时指定数据库吗?

django - 在 Django 中的开发/实时数据库之间同步数据