我正在开发一个django Web应用程序。
函数'xyx'(它更新变量)需要每2分钟调用一次。
我想要一个http请求启动守护进程并继续调用xyz(每2分钟一次),直到我发送另一个http请求来阻止它。
欣赏你的想法。
由于 Vishal Rana
答案 0 :(得分:4)
有很多方法可以实现这一目标。假设服务器资源正确,我会编写一个python脚本,调用django目录下的函数xyz
(虽然导入必要的东西),只有/var/run/django-stuff/my-daemon.run
存在才会运行。让cron每两分钟运行一次。
然后,对于你的django函数,你的start函数会创建上面提到的文件(如果它尚不存在)并且stop函数会破坏它。
正如我所说,还有其他方法可以实现这一目标。你可以在循环中有一个python脚本等待大约2分钟......等等。在任何一种情况下,你都反对两个python脚本在两个不同的cpython调用上运行的事实(不知道是否是{ {1}})无法相互通信,因此python脚本之间的IPC并不简单,所以你需要使用某种形式的IPC(如信号量,文件等),而不仅仅是常见的变量(不起作用)
答案 1 :(得分:2)
可能有点被黑,但你可以试试这个:
设置一个每两分钟运行一次脚本的crontab条目。此脚本将检查磁盘上的某种标志(文件存在,文件内容等)以决定是否运行给定的python模块。这个问题是它可能需要1:59才能在启动后第一次运行该功能。
我认为如果你在view函数中启动了一个守护进程,它会使httpd工作进程保持活动状态以及连接,除非你弄清楚如何在不终止django视图函数的情况下发送连接。如果您希望能够为不同用户并行执行此操作,这可能会非常糟糕。同样以这种方式杀死这个函数,你必须以某种方式知道你想要杀死哪个python和/或httpd进程,这样你就不会杀掉所有这些。
实现它的真正方法是用w / e语言编写一个实际的守护进程,只需在django视图中调用“/etc/init.d/daemon_name start”和“... stop”进行系统调用。为此,您需要确保您的Web服务器用户具有执行守护程序的权限。
答案 2 :(得分:2)
如果简单的解决方案(在脚本中循环,临时文件发出crontab信号)对于您的预期用途而言太脆弱了,您可以使用Twisted设施process handling和scheduling和networking。您的Django应用程序(使用Twisted client)只需通过TCP(本地)与Twisted服务器进行通信。