celery项目中的应用

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 监控工具的使用

  1. 安装
    $ pip install flower
  2. 运行
    flower --port=5555
    或者
    $ celery flower --address=127.0.0.1 --port=5555
  3. 打开 http://localhost:5555:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值