celery一:celery基础

一、celery介绍

celery,是一个分布式异步消息任务队列,通过它可以轻松的实现异步处理。

使用场景:如果业务场景中需要用到异步任务或定时任务,就可以考虑使用celery。

  场景一:异步任务。对100台电脑执行一条批量命令,可能花很多时间,但你不想让你的程序等着结果返回,

而是给你返回一个任务ID,过些时间只需要拿着这个任务ID就可以查到任务执行结果;在任务执行时,

你可以继续做其它的事情。

  场景二:定时任务。

中间件:celery在执行任务时,需要通过一个消息中件间来接收和发送任务信息,以及存储任务结果。

一般中间件使用rabbitMQ,redis。

celery优点:

1.配置和使用简单

2.高可用:当任务执行失败或执行过程中发生连接中断,celery会自动尝试重新执行任务

3.快速:一个单进程的celery,每分钟可以处理上百万个任务

4.灵活:可以随意增加插件

二、安装python之celery包:

pip install celery

三、安装python之中单间件包,和配置中间件

配置中件间,仅需一行就可以:

安装rabbitMQ中件间:

rabbitMQ配置:

broken_url = "amqp://user:password@localhost:5672//"

 

安装redis中间件: pip install -U "celery[redis]"

redis配置:

broker_url = "redis://:password@localhost:6379/0"

 

四、启动redis服务器

安装redis:

启动redis服务器:/etc/init.d/redis-server start

要注意持久化配置:vim /etc/redis/redis.conf

默认配置:

save 900 1

save 300 10

save 60 10000

五、一个简单的celery示例

前提:启动redis

# 文件:task.py

# 第一步:创建celery app,创建任务函数

from celery import Celery

app = Celery('tasks', broker='redis://192.168.10.15', backend='redis://192.168.10.15')

@app.task
def add(x, y):
    print 'running..........', x, y
    return x +y

 

# 第二步:启动一个celery worker,当然可以启动多个worker(开多个窗口):

进入task.py所在目录,-A的参数tasks指的就是task.py文件

celery -A task worker --logleverl=info

# 第三步:调用任务:

from tasks import add
add.delay(3, 5)

在windows下, 如果出现错误:没有足够的参数解构 tasks, accept, hostname = _loc,则启动worker时,添加--pool参数

celery -A task worker --loglevel=info --pool=solo

# 第四步:查看执行过程和结果

 

#  查看1---worker:此时worker终端会显示收到一个任务,执行了一个任务

[2018-08-26 10:46:31,569: INFO/MainProcess] Received task: task.add[2749585a-fddd-41ad-ad04-2de1447d066c]
[2018-08-26 10:46:31,571: WARNING/MainProcess] running.........
[2018-08-26 10:46:31,571: WARNING/MainProcess] 3
[2018-08-26 10:46:31,572: WARNING/MainProcess] 5
[2018-08-26 10:46:31,575: INFO/MainProcess] Task task.add[2749585a-0fddd-41ad-ad4-2de1447d066c] succeeded in 0.01599999999962165s: 8

 

# 查看2--redis中的结果:

redis-clis
auth pwddsdsddaf
keys *

将看到一个key为 "clery-task-meta-"开头的key,后面是task_id

查看key的value,即可看到任务执行的结果:

 get "celery-task-meta-2749585a-fddd-41ad-ad04-2de1447d066c"

 

可以看到value是:

"{\"status\": \"SUCCESS\", \"result\": 8, \"traceback\": null, \"children\": [], \"task_id\": \"2749585a-fddd-41ad-ad04-2de1447d066c\"}"

 

结果是json字符串,取出来使用的时侯,要jason.loads():

data = json.loads("{\"status\": \"SUCCESS\", \"result\": 8, \"traceback\": null, \"children\": [],
\"task_id\": \"2749585a-fddd-41ad-ad04-2de1447d066c\"}
") print(data) # {'status': 'SUCCESS', 'result': 8, 'traceback': None, 'children': [], 'task_id': '2749585a-fddd-41ad-ad04-2de1447d066c'}

 

 # 查看3--代码中的结果:

# 如果要想在代码中接收任务结果,需要在调用任务的时侯,用变量接收执行任务的结果:

from tasks import add
result = add.delay(3, 5)

 # result结果,是一个对象:

result.ready()   # 结果是否准备好,即是否执行完成

result.get()  # 获取结果;如果有异常,会抛出异常,将导致代码抛出异常

result.get(timeou=1)  # 获取结果;如果超时未获取到结果,则抛出异常

result.get(propagate=False)  #获取结果;如果有异常,不抛出异常,返回错误信息

result.traceback  # 获取异常信息

from task import add
result = add.delay(3, 5)
print("task_id: ", result.task_id)
data = result.get(propagate=False)
print("result: ", data)
# task_id:  86d4422f-ae2b-484b-83ca-c287ddb54abc
# result:  8

 

posted on 2018-08-18 14:00  myworldworld  阅读(647)  评论(0)    收藏  举报

导航