一个守护进程每两分钟调用一次函数,具有启动和停止功能

1 投票
3 回答
629 浏览
提问于 2025-04-16 00:04

我正在开发一个Django的网页应用。

我有一个叫做'xyx'的函数(它用来更新一个变量),我希望每两分钟就能调用一次这个函数。

我想要的是,发一个HTTP请求后,这个后台进程就会开始运行,并且每两分钟调用一次xyx,直到我再发一个HTTP请求来停止它。

希望能听到大家的想法。

谢谢!
Vishal Rana

3 个回答

2

如果简单的解决方案(比如在脚本里循环,或者用定时任务通过临时文件来触发)对你的需求来说太脆弱了,你可以考虑使用Twisted提供的功能来处理进程调度网络。你的Django应用(使用Twisted的客户端)可以通过TCP(在本地)与Twisted服务器进行简单的通信。

2

可能有点小技巧,但你可以试试这个方法:

设置一个定时任务,每两分钟运行一次脚本。这个脚本会检查某种标志(比如文件是否存在、文件内容等),来决定是否运行某个Python模块。这样做的问题是,第一次运行这个功能可能会等到1分59秒才开始。

我觉得如果你在视图函数里启动一个守护进程,它会让httpd工作进程和连接保持活着,除非你想办法在不结束django视图函数的情况下发送关闭连接的指令。如果你想让不同用户同时使用这个功能,这样做可能会很糟糕。而且,如果你想通过这种方式结束这个功能,你得知道你想结束哪个Python或httpd进程,这样才能避免把所有进程都结束掉。

真正的做法是用任何语言编写一个真正的守护进程,然后在django视图中调用系统命令“/etc/init.d/daemon_name start”和“... stop”。为此,你需要确保你的web服务器用户有权限执行这个守护进程。

4

有很多方法可以做到这一点。假设你的服务器资源足够,我会写一个Python脚本,这个脚本会在你的Django目录“外面”调用一个叫xyz的函数(当然需要导入必要的东西),这个函数只有在/var/run/django-stuff/my-daemon.run这个文件存在时才会运行。然后可以设置cron每两分钟运行一次这个脚本。

接着,在你的Django函数中,启动函数会创建上面提到的文件,如果文件已经存在就不再创建,而停止函数则会删除这个文件。

正如我所说,还有其他方法可以实现这个功能。你可以让一个Python脚本循环运行,等待大约2分钟……等等。无论哪种情况,你都要面对这样一个事实:两个Python脚本在不同的CPython调用中运行(我不知道mod_wsgi是否也是这样),它们之间无法直接通信,因此在Python脚本之间的进程间通信并不简单,所以你需要使用某种正式的进程间通信方式(比如信号量、文件等),而不是简单的共享变量(那样是行不通的)。

撰写回答