繁体   English   中英

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

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

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

我有一个解决方案是使用锁文件。 基本上,在进程开始时创建一个锁文件,并在最后删除它。

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

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

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

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

编辑:

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

是的当然 ,这甚至可能 (并且这是一种轻描淡写的)在服务器上运行一个月或更长时间而不重启,如果服务器运行很多短期进程,那就更是如此。 您不仅需要检查是否存在与此pid匹配的正在运行的进程,还要检查进程统计信息以检查进程开始时间,命令行,父进程等,并确定它可能是同一进程还是新进程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM