什么時候使用celery
隊列化所有的東西。適用于后臺任務(wù)、在處理完web請求后還有工作需要做、確保某件事會被完成(異步的執(zhí)行它并啟用重試)、規(guī)劃定時任務(wù)。此外可以考慮分布式計算和并發(fā)的意義。
celery的依賴項
kombu 用于發(fā)送和接收消息,支持多種消息中間件。
kombu依賴amqp(純python實現(xiàn)的amqp客戶端)
billiard 多線程庫,性能、穩(wěn)定性更好。
pytz 提供了timezone和相關(guān)工具
[MySQL is throwing deadlock errors]
mysql的默認(rèn)隔離級別是REPEATABLE-READ,可以設(shè)置為READ-COMMITTED,更多可見MySQL - The InnoDB Transaction Model and Locking
task just hang
可能是到中間件的權(quán)限沒配置好
[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] 這些選項,需要保證擁有指定路徑的讀寫權(quán)限。
[Result backend doesn’t work or tasks are always in PENDING state]
所有的任務(wù)默認(rèn)都是 [PENDING] 狀態(tài),Celery在發(fā)送了該任務(wù)后也不會改變狀態(tài),之前沒有過記錄的任務(wù)也是PENDING。
首先確保該任務(wù)沒有設(shè)置 ignore_result
確保沒有設(shè)置 task_ignore_result
檢查是否有之前啟動的工作進(jìn)程沒有關(guān)閉,由于是可以同時啟動多個工作進(jìn)程的,可能你在啟動新進(jìn)程時忘記關(guān)閉之前的工作進(jìn)程了,而之前的工作進(jìn)程可能沒有配置記錄結(jié)果選項。
可以把 [--pidfile] 設(shè)成一個絕對路徑可避免這種情況發(fā)生。
確保結(jié)果backend正常:
result = task.delay()
print(result.backend)