天天看点

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