什么時候使用celery
隊列化所有的東西。適用于后臺任務、在處理完web請求后還有工作需要做驼壶、確保某件事會被完成(異步的執(zhí)行它并啟用重試)、規(guī)劃定時任務喉酌。此外可以考慮分布式計算和并發(fā)的意義热凹。
celery的依賴項
kombu 用于發(fā)送和接收消息泵喘,支持多種消息中間件。
kombu依賴amqp(純python實現(xiàn)的amqp客戶端)
billiard 多線程庫般妙,性能纪铺、穩(wěn)定性更好。
pytz 提供了timezone和相關工具
[MySQL is throwing deadlock errors]
mysql的默認隔離級別是REPEATABLE-READ碟渺,可以設置為READ-COMMITTED鲜锚,更多可見MySQL - The InnoDB Transaction Model and Locking
task just hang
可能是到中間件的權限沒配置好
[Worker doesn’t start: Permission Error]
如果使用的是 Debian, Ubuntu 或者其他的Debian-based的Linux發(fā)行版,注意/dev/shm 已經(jīng)被替換為 /run/shm苫拍。
簡單的解決方法:
# ln -s /run/shm /dev/shm
如果使用了 [--pidfile], [--logfile] [--statedb] 這些選項芜繁,需要保證擁有指定路徑的讀寫權限。
[Result backend doesn’t work or tasks are always in PENDING state]
所有的任務默認都是 [PENDING] 狀態(tài)绒极,Celery在發(fā)送了該任務后也不會改變狀態(tài)骏令,之前沒有過記錄的任務也是PENDING。
首先確保該任務沒有設置 ignore_result
確保沒有設置 task_ignore_result
檢查是否有之前啟動的工作進程沒有關閉垄提,由于是可以同時啟動多個工作進程的伏社,可能你在啟動新進程時忘記關閉之前的工作進程了,而之前的工作進程可能沒有配置記錄結果選項塔淤。
可以把 [--pidfile] 設成一個絕對路徑可避免這種情況發(fā)生摘昌。
確保結果backend正常:
result = task.delay()
print(result.backend)