一个守护进程每两分钟调用一次函数,具有启动和停止功能
我正在开发一个Django的网页应用。
我有一个叫做'xyx'的函数(它用来更新一个变量),我希望每两分钟就能调用一次这个函数。
我想要的是,发一个HTTP请求后,这个后台进程就会开始运行,并且每两分钟调用一次xyx,直到我再发一个HTTP请求来停止它。
希望能听到大家的想法。
谢谢!
Vishal Rana
3 个回答
可能有点小技巧,但你可以试试这个方法:
设置一个定时任务,每两分钟运行一次脚本。这个脚本会检查某种标志(比如文件是否存在、文件内容等),来决定是否运行某个Python模块。这样做的问题是,第一次运行这个功能可能会等到1分59秒才开始。
我觉得如果你在视图函数里启动一个守护进程,它会让httpd工作进程和连接保持活着,除非你想办法在不结束django视图函数的情况下发送关闭连接的指令。如果你想让不同用户同时使用这个功能,这样做可能会很糟糕。而且,如果你想通过这种方式结束这个功能,你得知道你想结束哪个Python或httpd进程,这样才能避免把所有进程都结束掉。
真正的做法是用任何语言编写一个真正的守护进程,然后在django视图中调用系统命令“/etc/init.d/daemon_name start”和“... stop”。为此,你需要确保你的web服务器用户有权限执行这个守护进程。
有很多方法可以做到这一点。假设你的服务器资源足够,我会写一个Python脚本,这个脚本会在你的Django目录“外面”调用一个叫xyz
的函数(当然需要导入必要的东西),这个函数只有在/var/run/django-stuff/my-daemon.run
这个文件存在时才会运行。然后可以设置cron每两分钟运行一次这个脚本。
接着,在你的Django函数中,启动函数会创建上面提到的文件,如果文件已经存在就不再创建,而停止函数则会删除这个文件。
正如我所说,还有其他方法可以实现这个功能。你可以让一个Python脚本循环运行,等待大约2分钟……等等。无论哪种情况,你都要面对这样一个事实:两个Python脚本在不同的CPython调用中运行(我不知道mod_wsgi
是否也是这样),它们之间无法直接通信,因此在Python脚本之间的进程间通信并不简单,所以你需要使用某种正式的进程间通信方式(比如信号量、文件等),而不是简单的共享变量(那样是行不通的)。