2012-02-06 43 views
2

問題與thisthis有關;最簡單的Django定時/計劃任務(例如:提醒)?

不同之處在於,我更喜歡可能更精確和低負載的東西(每分鐘cron作業對於那些人來說並不可取)並且開銷很小(即,用rabbitmq安裝芹菜看起來像是一個大的矯枉過正)。

這樣的一個示例任務是個人提醒服務器(提醒可以通過網絡編輯並通過電子郵件或XMPP發送)。

我可能在尋找一些更像node.js的setTimeout但django(儘管我可能更喜歡在node.js中實現提醒,但它仍然是一個可能有趣的問題)。例如,可以在django應用程序中啓動新線程(函數由sleep()和send())組成;在哪些方面這可能是不好的?

+1

我不知道你的我的克隆(反之亦然)是否與我完全相同的項目工作。如果是這樣,我們可能無法生存,如果我們見面。宇宙對我們來說似乎太小了。 – 2012-02-06 22:39:09

+0

您不必與Celery一起使用RabbitMQ:http://docs.celeryproject.org/en/latest/getting-started/brokers/index.html(也有Amazon SQS不在此列表中,但是可能會比cron的一分鐘精度帶來更多的延遲;) – asksol 2012-02-07 10:30:39

+0

@MK_Dev,我實際上還沒有在任何這樣的項目上工作,只是計劃也許會得到它。雖然如果你正在做類似或相關的事情,可能會加入一些有趣的事情。 – HoverHell 2012-02-07 14:32:03

回答

0

對於此解決方案使用線程的問題是Python線程的典型問題,它總是將人們推向多進程解決方案。這個問題在你的線程不是由正常的請求 - 響應週期驅動的事實上是複雜的。 Malcolm Tredinnick here

不得不不同意。線程不是解決這個問題的好辦法。 問題是過程管理。正如所寫,您的線程永遠不會被 重新加入。網絡服務器進程的生命週期無法控制,你可以通過 (MaxRequestsPerChild Apache參數和其他 服務器中類似的東西)來解決,並且通過使用線程來解決這個問題。

如果你需要一個過程與不被 請求 - 響應路徑相匹配的生命週期 - 這是長時間運行,並且獨立於 響應 - 一個完全獨立的過程,絕對是正確的模式 使用。使用一個線程將它綁定到響應生命週期,哪個 會有意想不到的副作用。

一個可能的解決方案可能是讓您有一個長時間運行的進程來執行您的任務,從輕cron進程獲取喚醒信號。

另一種可能性是使用0mq來構建一些東西,它比AMQP風格的隊列輕得多(當然這是以某些功能爲代價的)。 Tarek Ziade正在開發一個名爲powerhose的Mozilla項目,該項目使用0mq,看起來非常簡單,並且具有第二個分辨率的心跳功能。

+0

這裏是塔雷克建立這個圖書館的推理:http://tarekziade.wordpress.com/2012/02/06/scaling-crypto-work-in-python/ – 2012-02-07 06:18:53

+0

啊哈。關於這個評論,我理解生命週期管理問題已經足夠了(據我所知,如果只使用django的內部網絡服務器,這不會成爲太多問題)。但是臨時線程究竟發生了什麼並且無法修復? – HoverHell 2012-02-07 14:41:13