如何在 python Django 框架中只执行一个 运行 进程实例?

How to enforce only one running instance of a process in python Django framework?

我有一个 python Django 管理命令,应该在收到输入文件时调用该命令,但该命令对于并行调用不安全。因此,只有在没有其他文件正在处理时,才应处理输入文件。

我的一个解决方案是使用锁定文件。基本上,在进程开始时创建一个锁定文件并在结束时将其删除。

我担心如果进程崩溃,锁定文件将不会被删除,因此 none 其他文件将被处理,直到我们手动删除该锁定文件。

解决方案不需要特定于 Django 甚至 python,但强制执行此进程的唯一一个实例的最佳做法是什么 运行?

正如 KlausD 在他的评论中提到的那样,规范(和语言无关)的解决方案是使用包含 运行 进程的 pid 的锁文件,因此负责获取锁的代码可以检查是否进程还在运行。

如果您在项目中使用 Redis,另一种解决方案是将锁存储在 Redis 中,其 TTL 比任务的最坏情况下的运行时间稍长。这确保了锁将被释放,并且还允许在需要时轻松地在多个服务器之间共享锁。

编辑:

is it possible that the process crashes and another process pick up the same pid?

Yes, of course, and that's even rather likely (and this is an understatement) on a server running for month or more without reboot, and even more so if the server runs a lot of short-lived processes. You will not only have to check if there's a running process matching this pid but also get the process stats 检查进程启动时间、命令行、父进程等,并确定它是同一进程还是新进程的可能性。

请注意,这并不是什么新鲜事 - 大多数进程监控工具都面临着同样的问题,因此您可能想看看他们是如何解决这个问题的(gunicorn 可能是一个很好的起点)。