参考链接
celery参考
celery中文官网:http://docs.jinkan.org/docs/celery/
celery英文官网:http://docs.celeryproject.org/en/latest
https://www.cnblogs.com/forward-wang/p/5970806.html
全局参考:
https://www.zhihu.com/question/51248775
https://blog.youkuaiyun.com/vintage_1/article/details/47664297(关键)
http://itfish.net/article/54265.html
https://www.cnblogs.com/jonathan1314/p/7649249.html
https://www.jianshu.com/p/7f1cd9caf181
https://cloud.tencent.com/developer/article/1333721
https://blog.youkuaiyun.com/pushiqiang/article/details/79405874
https://blog.youkuaiyun.com/sinat_29699167/article/details/79688464
https://www.jianshu.com/p/e97ca5315c90
https://my.oschina.net/kinegratii/blog/292395
https://github.com/celery/celery/blob/master/examples/django/proj/settings.py
rabbitmq:
https://www.cnblogs.com/royfans/p/10204626.html
https://blog.youkuaiyun.com/qq_35781732/article/details/79807160
celery日志:
官网:http://docs.jinkan.org/docs/celery/configuration.html#logging
http://www.itkeyword.com/doc/8500221593510822x204
https://www.imooc.com/article/27654?block_id=tuijian_wz
https://stackoverflow.com/questions/18995020/django-celery-task-logging
https://blog.youkuaiyun.com/qq_27437781/article/details/83507110
https://www.jianshu.com/p/06f4fa3975d0
logging 官网:https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig
celery-task-tigger参考:
https://www.oschina.net/p/celery-task-tigger
https://github.com/boylegu/celery-task-tigger
一、celery的结构
1.组成流程:
定时任务 异步任务
\ / (发送)
消息中间件
/ | \ (监控)
执行单元 执行单元 执行单元
\ | /
\ | / (存储)
结果存储
2.任务模块:异步任务、定时任务,
异步任务通常在业务逻辑中被触发并发往任务队列
定时任务由 Celery Beat 进程周期性地将任务发往任务队列
两个任务调用不同的线程,没有直接联系
3.消息中间件,即任务队列, 是一种跨线程、跨机器工作的一种机制.
RabbitMQ
Redis
使用数据库
其他的消息中间键值见官网http://docs.celeryproject.org/en/latest/getting-started/brokers/index.html
4.单个celery 任务的测试
代码见:https://github.com/duxinn/django-celery/tree/master/celery_app_1
测试项目celery_app_1目录如下:
celery.py 内容见下
# -*- coding: utf-8 -*-
from celery import Celery
app = Celery('app_1', backend="amqp") # 创建 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 # 任务过期时间,不建议直接写86400,应该让这样的magic数字表述更明显
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=3), # 每 30 秒执行一次
'args': (1, 1) # 任务函数参数
},
'multiply-at-some-time': {
'task': 'celery_app_1.task2.mymul',
'schedule': crontab(hour=9, minute=50), # 每天早上 9 点 50 分执行一次
'args': (1, 2) # 任务函数参数
}
}
task1.py中的代码如下:
from __future__ import absolute_import
import time
from .celery import app
@app.task
def myadd(x, y):
time.sleep(1)
return x + y
然后,分别启动异步任务进程 work 和定时任务进程 beat ,在celery_app_1的同级目录下:执行
celery -A celery_app_1 worker --loglevel=info 参数 -A --app 表示指定哪个项目, 后面是项目名, celery_app_1必须是一个包,里面有__init__.py 文件 参数 --loglevel 指定了日志级别,默认为 warning,也可以使用 -l info 来表示
celery beat -A celery_app_1
启动后的界面如下
定时任务启动后界面:
这个celery测试用的消息中间件是 rabbitmq,直接用的默认的配置,并未对 rabbitmq进行设置
二、消息队列rabbitmq的配置
安装
sudo apt-get install rabbitmq-server
添加用户,myuser为用户名,mypassword为用户密码
sudo rabbitmqctl add_user myuser mypassword
查看用户
sudo rabbitmqctl list_users
新增管理员用户 myuser为用户名密码,administrator为管理员标签
sudo rabbitmqctl set_user_tags myuser administrator
添加虚拟环境
sudo rabbitmqctl add_vhost vhost
设置用户在虚拟环境下拥有所有权限
sudo rabbitmqctl set_permissions -p vhost myuser ".*" ".*" ".*"
可以用刚设置的账户登录管理页面
http://服务器ip:15672
三、django-celery
完整代码见:https://github.com/duxinn/django-celery/tree/master/dc_1,文章立这里只是把效果和关键配置贴出来
1. 在django的后台可以添加定时任务:
路径为http://ip:端口/admin/djcelery/
点击 Periodic tasks 的添加就可以添加任务,路径http://ip:端口/admin/djcelery/add
下半部分
Task(registered) 下拉框里面会显示应用下的tasks.py中定义的函数,
Enable 复选框是暂停和激活这个任务,
Interval和crontab可以在http://ip:端口/admin/djcelery/中添加,添加后此页面的下拉菜单中会有选项,
Arguments 是列表形式传入的参数,
Keyword arguments 是字典形式传参,
2. 启动过程
需要启动三个进程,
django进程 python3 manage.py runserver 0.0.0.0:9015
异步任务的work进程 python3 manage.py celery worker
定时任务的beat进程 python3 manage.py celery beat
启动后界面如下