[英]Django: How to ignore tasks with Celery?
在不更改代碼本身的情況下,有沒有辦法忽略 Celery 中的任務?
例如,當使用 Django 郵件時,有一個Dummy Backend設置。 這是完美的,因為它允許我從.env
文件停用某些環境(如測試或暫存)中的郵件發送。 處理郵件發送的代碼本身不會因if
語句或裝飾器而改變。
對於 celery 任務,我知道我可以使用模擬或裝飾器在代碼中完成,但我想以一種符合 12 因素的干凈方式來完成,就像 Django 郵件一樣。 任何的想法?
這背后的主要動機之一是它在 Django web 服務器和 Celery 任務之間創建耦合。 例如,在運行單元測試時,如果代理服務器(對我來說是 Redis)沒有運行,那么如果調用delay()
方法,它將永遠凍結,因為當 Celery 嘗試向 Redis 發送任務時沒有超時。從架構的角度來看,這是非常糟糕的。 我希望我的單元測試能夠正常運行而無需運行 Celery 代理!
謝謝!
就耦合而言,如果您使用虛擬后端,您的 Django 應用程序仍將綁定到 celery。 只是您的任務不會執行。 也許這在您的情況下是可以接受的,但在我看來,它可能會導致一些問題。 例如,如果您嘗試測試的代碼片段向 celery 提交了一個任務,而在稍后的部分中,嘗試檢索該任務的結果,它將失敗。 因為虛擬后端永遠不會執行任務。
對於單元測試,正如您在問題中提到的,您可以使用task_always_eager設置。 如果你打開它,你的 Django 應用將不再依賴於正在運行的 worker。 它將以同步方式在同一個線程中執行任務並返回結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.