我正在開發一個django web應用程序。守護進程每2分鐘調用一次具有啓動和停止功能的函數
函數'xyx'(它更新變量)需要每2分鐘調用一次。
我想要一個http請求應該啓動守護進程,並保持調用xyz(每2分鐘),直到我發送另一個http請求來停止它。
欣賞你的想法。
感謝 維沙爾林蛙
我正在開發一個django web應用程序。守護進程每2分鐘調用一次具有啓動和停止功能的函數
函數'xyx'(它更新變量)需要每2分鐘調用一次。
我想要一個http請求應該啓動守護進程,並保持調用xyz(每2分鐘),直到我發送另一個http請求來停止它。
欣賞你的想法。
感謝 維沙爾林蛙
有許多的方式來實現這一目標。假設正確的服務器資源,我會編寫一個python腳本,它調用django目錄「外部」的函數xyz
(儘管導入必要的東西),只有在存在/var/run/django-stuff/my-daemon.run
時纔會運行。讓cron每兩分鐘運行一次。
然後,對於您的django函數,如果您的django函數尚不存在,並且stop函數將其銷燬,那麼您的啓動函數將創建上述文件。
正如我所說,還有其他方法可以實現這一點。你可以在一個循環中等待大約2分鐘的Python腳本......等等。在任何情況下,你都會遇到這樣的事實,即兩個python腳本運行在兩個不同的cpython調用上(不知道這是否與mod_wsgi
)不能相互通信,因此Python腳本之間的IPC並不簡單,所以你需要使用某種形式的IPC(比如信號量,文件等)而不是普通的變量(這是行不通的)。
可能有點砍死,但你可以試試這個:
設置一臺運行一個腳本每兩分鐘一個crontab項。該腳本將檢查磁盤上的某種標誌(文件存在,文件內容等),以決定是否運行給定的python模塊。問題在於,啓動後第一次運行該功能可能需要1:59的時間。
我認爲,如果你在視圖函數中啓動了一個守護進程,它將保持httpd工作進程以及連接一直存在,除非你知道如何在不終止django視圖函數的情況下關閉連接。如果你想能夠爲不同的用戶並行執行此操作,這可能會非常糟糕。同樣以這種方式殺死函數,你將不得不以某種方式知道你想殺死哪個python和/或httpd進程,以免殺死所有進程。
真正的做法是用w/e語言編寫一個實際的守護進程,然後在django中對系統調用「/etc/init.d/daemon_name start」和「... stop」觀點。爲此,您需要確保您的Web服務器用戶有權執行守護進程。
如果簡單的解決方案(環在腳本中,通過crontab的一個臨時文件信號)是你的使用目的太脆弱了,你可以使用Twisted設施process handling和scheduling和networking。您的Django應用程序(使用Twisted client)只需通過TCP(本地)與Twisted服務器進行通信。
+1,根本不是一個壞主意。 – 2010-06-16 22:40:21
+1分鐘前在我之前:( – Puddingfox 2010-06-16 22:14:09
+1使用cron而不是試圖在django上做它 – nosklo 2010-06-16 22:37:22
你可以結合使用兩個cron + django自定義管理命令http://docs.djangoproject.com/en/ dev/howto/custom-management-commands/ – eos87 2010-06-16 22:44:02