2010-06-16 14 views

回答

4

有許多的方式來實現這一目標。假設正確的服務器資源,我會編寫一個python腳本,它調用django目錄「外部」的函數xyz(儘管導入必要的東西),只有在存在/var/run/django-stuff/my-daemon.run時纔會運行。讓cron每兩分鐘運行一次。

然後,對於您的django函數,如果您的django函數尚不存在,並且stop函數將其銷燬,那麼您的啓動函數將創建上述文件。

正如我所說,還有其他方法可以實現這一點。你可以在一個循環中等待大約2分鐘的Python腳本......等等。在任何情況下,你都會遇到這樣的事實,即兩個python腳本運行在兩個不同的cpython調用上(不知道這是否與mod_wsgi )不能相互通信,因此Python腳本之間的IPC並不簡單,所以你需要使用某種形式的IPC(比如信號量,文件等)而不是普通的變量(這是行不通的)。

+0

+1分鐘前在我之前:( – Puddingfox 2010-06-16 22:14:09

+1

+1使用cron而不是試圖在django上做它 – nosklo 2010-06-16 22:37:22

+1

你可以結合使用兩個cron + django自定義管理命令http://docs.djangoproject.com/en/ dev/howto/custom-management-commands/ – eos87 2010-06-16 22:44:02

2

可能有點砍死,但你可以試試這個:

設置一臺運行一個腳本每兩分鐘一個crontab項。該腳本將檢查磁盤上的某種標誌(文件存在,文件內容等),以決定是否運行給定的python模塊。問題在於,啓動後第一次運行該功能可能需要1:59的時間。

我認爲,如果你在視圖函數中啓動了一個守護進程,它將保持httpd工作進程以及連接一直存在,除非你知道如何在不終止django視圖函數的情況下關閉連接。如果你想能夠爲不同的用戶並行執行此操作,這可能會非常糟糕。同樣以這種方式殺死函數,你將不得不以某種方式知道你想殺死哪個python和/或httpd進程,以免殺死所有進程。

真正的做法是用w/e語言編寫一個實際的守護進程,然後在django中對系統調用「/etc/init.d/daemon_name start」和「... stop」觀點。爲此,您需要確保您的Web服務器用戶有權執行守護進程。

2

如果簡單的解決方案(環在腳本中,通過crontab的一個臨時文件信號)是你的使用目的太脆弱了,你可以使用Twisted設施process handlingschedulingnetworking。您的Django應用程序(使用Twisted client)只需通過TCP(本地)與Twisted服務器進行通信。

+0

+1,根本不是一個壞主意。 – 2010-06-16 22:40:21