celery项目结构
因为celery是一个单独的应用. 所以他可以在任何地方. 你可以把celery当作一个app 放进你的项目里.
我的目录结构是这样的
- IMCenter
- init.py
- celery.py
- celery_cfg.py
- tasks.py
代码就是参考celery官方教程写的了.
celery.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from celery import Celery
__author__ = "LiuNan"
__date__ = "2020/12/16 4:31 下午"
from .celery_cfg import backend, brokers
celery_app = Celery('IMCenter',
broker=brokers,
backend=backend,
include=['IMCenter.tasks'])
celery_app.conf.update(
result_expires=3600,
)
celery_app.conf.timezone = 'Asia/Shanghai'
tasks.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
__author__ = "LiuNan"
__date__ = "2020/12/16 4:31 下午"
# -*- coding: utf-8 -*-
import logging
import time
import jpush
from .celery import celery_app
_logger = logging.getLogger(__name__)
@celery_app.task
def myPush(a,b,c,d):
# 生产环境推送
print('发送短信中')
celery_cfg.py
# -*- coding: utf-8 -*-
__author__ = "LiuNan"
__date__ = "2020/12/16 4:31 下午"
brokers = "redis://:password@localhost:6379/1"
backend = "redis://:password@localhost:6379/2"
celery 的启动
切换到celery所在项目的目录
-
前台启动命令
celery -A IMCenter worker -l info
启动成功的界面 如下 :
-
后台启动命令
我在这里使用的是supervisor后期启动服务的. 传送门
完事儿了, 就这么简单. 生产者调用task就行了.
celery任务的调用
这样
from openerp.IMCenter.celery import
task_args = (1,2,3,4)
celery_appcelery_app.send_task('IMCenter.tasks.myPush',args=task_args)
delay
apply_async方法的别名,但接受的参数较为简单
task.delay()
myPush.delay(1,2,3,4)
apply_async
常用
task.apply_async(args=[arg1,args],kwargs={key:value})
可以接受复杂的参数
- task_id:为任务分配唯一id,默认是uuid
- countdown:设置该任务等待一段时间在执行,单位为秒
- eta:定义任务的开始时间,eta=time.time()+5,单位为秒,是UTC时间,设置成国内时间也没有用
- expires:设置任务过期时间,任务在过期时间后还没有执行则被丢弃,单位为秒
- retry:如果任务失败后,是否重试,默认为True
- shadow:重新指定任务的名字,覆盖其在日志中使用的任务名称
- retry_policy:{} 重试策略,
- max_retries:最大重试次数,默认为3次。
- interval_start:重试等待的时间间隔,默认为0。
- interval_step:每次重试让重试间隔增加的秒数,默认为0.2秒。
- interval_max:重试间隔最大的秒数,既通过interval_step增大到多少秒之后,就不在增加了,默认为0.2秒。
- routing_key:自定义路由键
- queue:指定发送到哪个队列
- exchange:指定发送到哪个交换机
- priority:任务队列的优先级,0到255之间,对于rabbitmq来说0是最高优先级
- headers:为任务添加额外的消息
# 任务my_task将会被发送到my_queue队列中,并且在发送10秒之后执行。
myPush.apply_async((1,2,3,4), queue='my_queue', countdown=10)
send_task
不建议用,因为不会校验是否存在这个方法,直接就发送成功里,celery执行就会报错
app.send_task(task1.add,args=[1,2])
- name:可以显示指定任务的名字,默认是本函数的名字,也就是上面的 shadow
- bind:一个bool值,设置是否绑定一个task的实例,如果绑定,task实例会作为参数传递到任务方法中(第一个参数为self),可以访问task实例的所有属性。
- base:定义任务的基类,可以以此来定义回调函数,默认是Task类,我们也可以定义自己的Task类
- default_retry_delay:设置该任务重试的延迟时间,当任务执行失败后,会自动重试,单位是秒,默认为3分钟
Flower Celery 监控工具的使用
- 安装
$ pip install flower
- 运行
flower --port=5555
或者
$ celery flower --address=127.0.0.1 --port=5555
- 打开 http://localhost:5555: