簡體   English   中英

Django:如何忽略 Celery 的任務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM