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

Posted

技术标签:

【中文标题】python - 如何在python Django框架中只强制一个进程的运行实例?【英文标题】:How to enforce only one running instance of a process in python Django framework? 【发布时间】:2019-01-30 11:44:19 【问题描述】:

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

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

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

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

【问题讨论】:

将pid写入lockfile并检查pid是否存在。 @KlausD。是否有可能进程崩溃而另一个进程获取相同的 pid? 【参考方案1】:

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

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

编辑:

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

Yes、of course,甚至是rather likely(这是轻描淡写的)在服务器上运行一个月或更长时间而无需重新启动,如果服务器运行大量短期进程则更是如此.您不仅要检查是否有与此 pid 匹配的正在运行的进程,还要检查get the process stats 以检查进程开始时间、命令行、父进程等,并确定它是同一进程还是新进程的可能性。

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

【讨论】:

进程崩溃而另一个进程获取相同的 pid 是否可能? @bruno-desthuilliers

以上是关于python - 如何在python Django框架中只强制一个进程的运行实例?的主要内容,如果未能解决你的问题,请参考以下文章

Python 和 Django - 如何在内存和临时文件中使用

如何在Django中向Python路径添加位置

在pycharm里如何把一个普通的python项目改造成django项目?

Python学习笔记——1环境搭建篇(如何在Pycharm中配置Python和Django)

干货福利:如何使用Python中Django模板?

在 Python/Django 中,如何配置默认测试设置?