文章目录
一、celery跑起来!
组件安装
主角 : celery
配角 : redis 或者 rabbitmq
linux:
pip install reids celery
windows
pip install redis eventlet
注意 :
windows上使用celery,bug很多,慎用!
启动celery时,记得后面加上 -P eventlet
比如 : celery worker -A app1 -c 16 -P eventlet
架构图:如下所示
-
user 就是用户的控制代码。(比如下面你的app.py)
-
borker 是中间件,可以使用 redis 或者 rabbitmq.
-
workers 就是 执行具体任务的代码。 (比如下面的 tasks.py)
-
backend 是结果存储的地方, 支持很多存储方式,常见的是 支持sqlalchemy的数据库、redis等。

使用步骤
1 配置broker 和 backend
broker只支持 redis, rabbitmq。
broker = 'redis://localhost:6379/1'
backend 可以使用很多,比如支持sqlalchemy的数据库,redis也行。
backend = 'redis://localhost:6379/2'
result_backend = 'db+sqlite:///results.sqlite'
result_backend = 'db+mysql://scott:tiger@localhost/foo'
result_backend = 'db+postgresql://scott:tiger@localhost/mydatabase'
result_backend = 'db+oracle://scott:tiger@127.0.0.1:1521/sidname'
2 编写worker代码
tasks.py
import time
from celery import Celery
database = 'redis'
ip = '192.168.92.128'
port = '6379'
uri = f"{database}://{ip}:{port}/" + '{}'
# redis 2号 数据库是 接受任务队列
broker = uri.format(2)
# redis 3号 数据库是 存储执行结果队列
backend = uri.format(3)
app = Celery('my_task', broker=broker, backend=backend)
@app.task
def add(x, y):
print('enter add, task is running ...')
time.sleep(3)
return x + y
3 启动worker
# 要在命令行中启动workers
# win上的命令是 : celery worker -A tasks -P eventlet -l INFO -c 20
# Linux或者mac : celery worker -A tasks -l INFO -c 20
-A : 指定worker工作的脚本
-l : 日志级别,默认是警告。
-c : 控制worker的数量。
4 编写应用代码
app.py
from tasks import add
import time
if __name__ == '__main__':
stime = time.time()
# 实际上这样调用只是把任务发给了worker,参见redis/2
# 后续怎么执行,这个代码里根本不管。由celery接管,异步执行。
for i in range(100):
res = add.delay(i, i + 3)
print(res)
print(time.time() - stime)
二、使用配置文件
代码结构如下:

步骤
建立应用模块app1
建立配置文件
# config.py
socket = '192.168.92.129:6379'
BROKER_URL = f'redis://{socket}/2'
CELERY_RESULT_BACKEND = f'redis://{socket}/3'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_IMPORTS = (
'app1.task1',
'app1.task2',
)
初始化celery app
# __init__.py
rom celery import Celery
app = Celery('app1')
app.config_from_object('app1.config')
编写功能代码
# task1.py
from app1 import app
@app.task
def t1(x):
a, b, n = 0, 1, 0
while n < x:
a, b = b, a + b
n += 1
return b
测试
# main.py
from app1.task1 import t1
from app1.task2 import t2
for i in range(1, 2000):
a = t1.delay(i + 30000)
b = t2.delay(i + 30000)
print(a, b)
启动celery命令
# windows上
celery worker -A app1 -c 16 -P eventlet
# linux,mac……
celery worker -A app1 -c 16
三、定时任务
修改配置文件
- from celery.schedules import crontab
- CELERY_TIMEZONE = ‘Asia/Shanghai’
- CELERYBEAT_SCHEDULE = {}
# config.py
from datetime import timedelta
from celery.schedules import crontab
redis_url = 'localhost:6379'
BROKER_URL = f'redis://{redis_url}/2'
CELERY_RESULT_BACKEND = f'redis://{redis_url}/3'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_IMPORTS = (
'app1.task1',
'app1.task2',
)
# 第一个是每隔一段时间执行,
# 第二个是在每天的几点几分执行。
CELERYBEAT_SCHEDULE = {
'task1': {
'task': 'app1.task1.t1',
'schedule': timedelta(seconds=10),
'args': (55555,)
},
'task2': {
'task': 'app1.task2.t2',
'schedule': crontab(hour=18, minute=8),
'args': (66666,)
}
}
celery 启动命令
其实是使用celery beat命令,此命令用定时执行
celery worker -A app1 -B -c 20
四、flower监控中间件
使用 pip install flower 安装该模块。
简单监控
celery flower --broker=redis://localhost:6379/2 --address=0.0.0.0 --port=5555
然后浏览器打开 http://localhost:5555 即可。
五、supervisor管理进程
这是一个用于进程管理的工具,功能极其强大!
结构和功能
由几个组件构成
- supervisord 启动supervisor 服务
- supervisorctl 客户端工具
步骤
编写配置文件
样例:
# sv.conf
# 开启web监控,可以通过web控制进程。
[inet_http_server]
port=9001
username=user
password=123
# 建立一个监控进程,名字叫 simple_celery_test
[program:simple_celery_test]
priority=999
directory=/home/blueky/SourceCode/celery_code/celery001
stdout_logfile=/home/blueky/SourceCode/celery_code/celery001/log/out.log
stderr_logfile=/home/blueky/SourceCode/celery_code/celery001/log/err.log
command=celery worker -A tasks -c 10
启动supervisord
supervisord -c sv.conf
web端控制
浏览器打开 http://localhost:9001 即可。
修改配置文件
-
修改配置文件
-
终端输入 supervisorctl
-
在交互式命令行中输入 update即可
317



被折叠的 条评论
为什么被折叠?



