2011-02-24 50 views
2

我有一個Django的Web應用程序,它創建並保存數據庫中的作業。對於每項工作,我都必須發送電子郵件並將數據導出到其他系統。我想做異步。Python/Django AMQP?

推薦的方法是什麼?

  • 它必須可靠(如果服務意外停止,則不會錯過任何作業)。
  • 如果發生錯誤,必須有簡單的方法來查找日誌。
  • 我希望能夠輕鬆添加更多可處理作業的工作人員。

  • 也許它會更好,如果作業隊列是相同的數據庫表,所以我可以通過簡單地更改他們在數據庫中的狀態輕鬆取消作業?

  • 如果解決方案與Django框架有關,也許會更好嗎?

回答

6

我會考慮使用http://celeryproject.org/,在您的情況下,您可能可以使用https://github.com/ask/django-celery來簡化與現有應用程序的集成,儘管在您的django項目中自己使用celery也應該非常簡單。

Celery爲應該在工作機器上異步運行的任務提供基於函數/類的抽象。您可以擁有多個工作機器並動態添加工作人員。整個事情是由RabbitMQ的供電(www.rabbitmq.com),這樣你的Django應用程序就會把任務分成隊列中基本上是做一樣的東西:

from mycelerytasks import send_email 

... 

deferred_result = send_email.apply_async(*args, **kwargs) 

如果你想等到任務完成,你可以做deferred_result.wait()但在你的情況下,你可能會放棄它,讓你的觀點完成,所以用戶不會等待回答。

1

我不知道這是你想要的,但我處理這種事情有一個週期性的cron作業我的Linux服務器上,運行一個python腳本。 (A計劃任務就相當於在Windows上)

您可以通過操縱sys.path的名單,像這樣訪問你的項目在您的Python腳本模塊和設置:

import sys 
import os 
sys.path.append(PATH_TO_PROJECT_DIR) 
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

這也許是一個一點點的原始解決方案,因爲它是由你來整理日誌記錄,工作隊列等......,但對於簡單的保管東西,如發送電子郵件,並且很容易實現,這很好。