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

2024-01-12

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

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

我担心如果进程崩溃,锁定文件将不会被删除,因此在我们手动删除该锁定文件之前,不会处理任何其他文件。

该解决方案不需要特定于 Django 甚至 Python,但是强制只运行该进程的一个实例的最佳实践是什么?


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

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

EDIT:

是否有可能进程崩溃而另一个进程获取相同的 pid?

Yes https://superuser.com/questions/135007/how-are-pids-generated, 当然 https://blogs.msdn.microsoft.com/oldnewthing/20110107-00/?p=11803,这甚至是很有可能 http://benno.id.au/blog/2015/06/28/identifying-linux-processes(这是轻描淡写的)在运行一个月或更长时间而无需重新启动的服务器上,如果服务器运行大量短期进程,则更是如此。您不仅需要检查是否有与该 pid 匹配的正在运行的进程,还需要检查获取进程统计信息 https://github.com/giampaolo/psutil#process-management检查进程启动时间、命令行、父进程等,并确定它是同一进程还是新进程的可能性。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 python Django 框架中强制只运行一个进程实例? 的相关文章

随机推荐