celery 安装
sudo pip3 install celery
redis安装
sudo apt install redis-server
redis 启动
redis-server
测试redis是否启动
user@host: ~$ redis-cli
127.0.0.1:6379> ping
PONG
如图创建 celery_app_1.py 文件
在__init__.py中
# -*- coding: utf-8 -*-
from celery import Celery
app = Celery('app_1') # 创建 Celery 实例
app.config_from_object('celery_app_1.celeryconfig')
在celeryconfig.py中
from datetime import timedelta
from celery.schedules import crontab
CELERY_ANNOTATIONS = {'tasks.add': {'rate_limit': '2/s'}}
# 低优先级
CELERY_ROUTES = {
'tasks.add': 'low-priority',
}
# broker
BROKER_URL = 'redis://127.0.0.1:6379/10'
# backend
CELERY_RESULT_BACKEND = 'redis://localhost:6379/11'
CELERY_TASK_SERIALIZER = 'msgpack' # 任务序列化和反序列化使用msgpack方案
CELERY_RESULT_SERIALIZER = 'json' # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任务过期时间
CELERY_ACCEPT_CONTENT = ['json', 'msgpack'] # 指定接受的内容类型
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_IMPORTS = ( # 指定导入的任务模块
'celery_app_1.task1',
'celery_app_1.task2'
)
# schedules
CELERYBEAT_SCHEDULE = {
'add-every-30-seconds': {
'task': 'celery_app_1.task1.myadd',
'schedule': timedelta(seconds=5), # 每 30 秒执行一次
'args': (5, 8) # 任务函数参数
},
'multiply-at-some-time': {
'task': 'celery_app_1.task2.mymul',
'schedule': crontab(hour=9, minute=50), # 每天早上 9 点 50 分执行一次
'args': (3, 7) # 任务函数参数
}
}
在task1.py 中
import time
from celery_app_1 import app
@app.task
def myadd(x, y):
time.sleep(4)
return x + y
在task2.py中
import time
from celery_app_1 import app
@app.task
def mymul(x, y):
time.sleep(4)
return x * y
if __name__ == '__main__':
app.start()
在client.py 中
# -*- coding: utf-8 -*-
import time
'''此模块测试'''
from celery_app_1 import task1
from celery_app_1 import task2
t1 = task1.myadd.apply_async(args=[2, 8]) # 也可用 task1.add.delay(2, 8)
t2 = task2.mymul.apply_async(args=[3, 7]) # 也可用 task2.multiply.delay(3, 7)
print('hello world')
i = 0
while 1:
time.sleep(1)
i += 1
print('第', i, 'second')
if t1.ready():
print(t1.get())
if t2.ready():
print(t2.get())
if t1.ready() and t2.ready():
break
在终端运行以下命令启动 celery
celery -A tasks worker --loglevel=infcelery -A tasks worker --loglevel=info
启动成功的结果如上图
在终端输入 ipython3 进入ipython 命令行模式,导入
调用,并获取结果
启动client.py,python3 client.py,结果如下
hello world
第 1 second
第 2 second
第 3 second
第 4 second
10
21
定时任务
在开启一个窗口,输入 celery beat -A celery_app_1,启动成功的结果如下:
定时任务的程序已在 CELERYBEAT_SCHEDULE 中写好,所以这里只开启就好了
在主任务的窗口中可以看到每5秒执行一次的定时任务:
如果想直接在主程序启动的时候就启动定时任务,可以在用 -B参数启动
celery -A celery_app_1 worker -B --loglevel=info
参考资料
https://zhuanlan.zhihu.com/p/22304455
https://funhacks.net/2016/12/13/celery/
https://blog.youkuaiyun.com/happyAnger6/article/details/53889599