天天看點

celery使用入門

最近一個項目需要用到celery,于是去了了解了基本的應用方式,rt:

1. 安裝

http://www.celeryproject.org/install/

因為celery本身是依靠redis或者rabbitmq的,是以除了安裝celery外,需要安裝redis和rabbitmq等,此次選擇采用redis作為 Broker,因為想對與rabbitmq的話,redis還是有點熟悉,ampq不太了解,是以相關安裝以redis為準,再次感慨,無路什麼文檔,都比不過官方文檔為準,當然還需要google作為輔助

sudo pip install celery
   
   
    sudo pip install -U celery[redis]  (安裝celery的同時 安裝celery 的redis支援等),原話沒看太懂,需要再次細看

   
   
    sudo pip redis (安裝redis的python依賴)
   
   
    download  
    http://download.redis.io/releases/redis-2.8.12.tar.gz
   
   
    tar xzvf  
    redis-2.8.12.tar.gz  && cd redis-2.8.12 && make   (這是在src下,會出現redis-server, redis-client兩個可執行檔案)
         

ok,安裝階段到此完畢,redis和celery此時應該可以完美的運作了

2. 運作測試

測試代碼tasks.py(注意,檔案名稱最後在celery worker的時候引用,  ps:這裡引用的是官方代碼):

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379')
      
@app.task
def add(x, y):
    return x + y
      

存放在本地目錄以後,啟動celery worker

celery -A tasks worker --loglevel=info
      

測試:

>>> from tasks import add
>>> add.delay(4, 4)
      

這時,去檢視剛剛啟動的worker日志,就會發現,已經處理完成了

3. 需要注意的點

3.1 celery 任務狀态查詢

如果需要檢視儲存任務的狀态,celery需要存儲任務的狀态或者發送任務的狀态至某些存儲地方,這時,需要定義backend,如下: 這樣可以檢視任務的狀态及其執行結果:

result = add.delay(4, 4)
      
result.ready()
False
      
result.get(timeout=1)
8
      

get會再次引發task 的exception,

3.2 設定逾時 原話如下,覺得有點翻譯不好,就直接用了 The visibility timeout defines the number of seconds to wait for the worker to acknowledge the task before the message is redelivered to another worker. 

如上: 如何設定暫時還沒有确定:

3.3 注意事項

如果task 在visibility timeout 時間内沒有應答,任務會被重新發送至其它的worker并且被執行 在有些情況下,我們需要強制終止worker的執行,這時,如果設定visibility timeout 時間超長的情況下,會導緻celery延遲redelivery 那些“丢失掉”的task

監控活動不會被虛拟主機的設定影響

redis會在某些情況下會自動回收一些key,這種情況就是在redis碰見一些如下類似的錯誤:

InconsistencyError, Probably the key ('_kombu.binding.celery') has been
removed from the Redis database.
      

可以通過配置,redis-server timeout為0,可以避免redis 自動回收key