我正在嘗試使用 celery 運行任務。我需要在用戶按下發送按鈕時將發布請求發送到遠程服務器,所以我嘗試在設定檔案中使用帶有 Redis 的 celery 配置:
BROKER_URL = os.environ.get("REDIS_URL")
CELERY_RESULT_BACKEND = os.environ.get("REDIS_URL")
CELERY_ACCEPT_CONTENT = ["application/json"]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Dubai'
根據
以及如何定義重試選項的示例代碼
add.apply_async((2, 2), retry=True, retry_policy={
'max_retries': 3,
'interval_start': 0,
'interval_step': 0.2,
'interval_max': 0.2,
})
我希望我的任務運行 3 次以在出現任何故障時運行,并且每次重試之間的間隔為 60 秒。我的任務定義如下所示:
@shared_task
def api_generator(*args):
import requests
import json
url = os.environ.get("API_URL_CALL")
api_access_key = os.environ.get("API_ACCESS_KEY")
headers = {
"Authorization": api_access_key,
"Content-Type": "application/json"
}
json_schema = generate_json(*args)
response = requests.request("POST", url, headers=headers, data=json.dumps(json_schema), timeout=30)
if response.status_code != 200:
raise NameError("API Response error")
return response.status_code
但是當我的代碼失敗時,我在 celery 日志中看不到任何重試機制,這是什么問題?使用 apply_async 方法呼叫任務時如何定義重試?我是NameError("Exception")為了告訴工人發生了錯誤而提起訴訟。
uj5u.com熱心網友回復:
[編輯1:添加acks_late]
當你向 Celery Worker 發送任務時,有兩件事可能會出錯:
- 代理和訊息佇列的連接問題。
- 對工人提出的例外。
第一個問題可以通過定義retry和retry_policy你所做的來解決。
第二種(就是你要解決的),可以通過呼叫self.retry()任務失敗來解決。
根據您的問題型別,設定CELERY_ACKS_LATE = True.
查看這些鏈接以獲取更多資訊:
重試丟失或失敗的任務(Celery、Django 和 RabbitMQ)
https://coderbook.com/@marcus/how-to-automatically-retry-failed-tasks-with-celery/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384118.html
上一篇:Django表單-選擇下拉選單
下一篇:如何從序列化程式更改模型ID?
