python之celery的基本使用

celery在项目中用到,这段时间又在复习celery,俗话说:“好记性不如烂笔头”,写下celery的使用方法,为之后使用留下文档。

celery安装

1
pip install celery

配置

celery 需要配置broker, 而broker可以使用RQ或者redis。官方推荐RQ,一个特别简单的demo是

1
2
3
4
5
├── run_celery.py
└── xxkhcelery
├── __init__.py
├── celery.py
└── tasks.py

celery.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from celery import Celery

broker = "amqp://guest@localhost:5672/myvhost"
# broker = "redis://localhost:6379/3"
backend = "redis://localhost:6379/4"
app = Celery('xxkhcelery',
broker=broker,
backend=backend,
include=['xxkhcelery.tasks'])


app.conf.task_routes = {
'xxkhcelery.tasks.mul': {'queue': 'mul'}
}


if __name__ == '__main__':
app.start()

tasks.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from __future__ import absolute_import, unicode_literals

import time
from .celery import app

@app.task
def add(x, y):
print(f'和是{x+y}')
time.sleep(10)
return x + y

# 失败重试机制
"""
失败重试机制
第一步 task bind=True
第二步 self.retry(exc=e)失败重试
第三步:失败重试几次,多长时间重试一次
"""

@app.task(bind=True, default_retry_delay=10, retry_kwargs={'max_retries': 3}, name='tasks.divide')
def divide(self,**kw):
print("=========== 执行错误 ===============")
try:
a = 5/0
except Exception as e:
print("错误了")
raise self.retry(exc=e)

PS:在celery 4.6.0之前backendRQ去做,但是4.6.0之后就移除了这个使用方式,如果你backend使用RQ的话,就会报No module named 'celery.backends.amqp'错误

运行

在根目录运行

1
celery -A xxkhcelery worker   -l info

运行结果
运行结果

这里我把results: disabled://划出来了,当没有配置backend的时候,就不会返回结果,当配置的时候,就会变成results: redis://localhost:6379/4
那么这个redis里面保存的是什么呢?
backend返回数据

这样基本一个celery就完成了。

flower的使用

安装

1
pip install flower

启动

1
celery -A xxkhcelery flower --port=5555

使用

登录http://localhost:5555/即可查看