关闭

Celery消息队列----配置定时任务

标签: centos定时任务消息队列
366人阅读 评论(0) 收藏 举报
分类:

介绍

celery 定时器是一个调度器(scheduler);它会定时地开启(kicks off)任务,然后由集群中可用的工人(worker)来执行。

定时任务记录(entries)默认 从 beat_schedule 设置中获取,但自定义存储也可以使用,如把记录存储到SQL数据库中。

要确保同一时间一份时间表上只有一个调度器在运行,否则会因为重复发送任务而结束。使用集中途径意味着定时任务不用必须同步,并且服务无需用锁操控。

记录

为了定时调用任务,你必须添加记录到打点列表中:

from celery import Celery
from celery.schedules import crontab

app = Celery()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # 每10秒调用 test('hello') .
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # 每30秒调用 test('world') 
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # 每周一上午7:30执行
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)

用on_after_configure处理器进行这些设置意味着当使用test.s()时我们不会在模块层面运行app 。

add_periodic_task() 函数在幕后会添加记录到beat_schedule设定,同样的设定可以用来手动设置定时任务:

例子: 每30秒运行 tasks.add .

app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
app.conf.timezone = 'UTC'

一般会使用配置文件进行配置,如下
celeryconfig.py:

broker_url = 'pyamqp://'
result_backend = 'rpc://'

task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Europe/Oslo'
enable_utc = True
beat_schedule = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}

程序里使用:

app.config_from_object('celeryconfig')
注意
如果你的参数元组里只有一个项目,只用一个逗号就可以了,不要圆括号。

时间表使用时间差意味着每30秒间隔会发送任务(第一个任务在celery定时器开启后30秒发送,然后上每次距一次运行后30秒发送一次)

可使用的属性

  • task

    要执行的任务名字

  • schedule

    执行的频率

    可以是整数秒数,时间差,或者一个周期( crontab)。你也可以自 定义你的时间表类型,通过扩展schedule接口。

  • args

    位置参数 (list 或 tuple).

  • kwargs

    键值参数 (dict).

  • options

    执行选项 (dict).

    这可以是任何被apply_async()支持的参数与—-exchange, routing_key, expires,等。

  • relative

    如果 relative 是 true ,时间表“由时钟时间”安排,意味着 频率近似到最近的秒,分钟,小时或天,这取决于时间差中的时间间隔。
    默认relative是false,频率不会近似,会相对于celery的启动时间。

    Crontab 表达式语法非常灵活。

例子 含义
crontab() 每分钟执行
crontab(minute=0, hour=0) 每天午夜执行
crontab(minute=0, hour=’*/3’) 每三个小时执行: 午夜, 3am, 6am, 9am, 正午, 3pm, 6pm, 9pm.
crontab(minute=0,hour=’0,3,6,9,12,15,18,21’) 同上
crontab(minute=’*/15’) 每15分钟执行
crontab(day_of_week=’sunday’) 星期日每分钟
crontab(minute=’‘,hour=’‘, day_of_week=’sun’) 同上
crontab(minute=’*/10’,hour=’3,17,22’, day_of_week=’thu,fri’) 每10分钟执行,仅限于周六日3-4 am, 5-6 pm, and 10-11 pm
crontab(minute=0, hour=’/2,/3’) 偶数小时或者能被3整除的小时数执行
crontab(minute=0, hour=’*/5’) 被5整除的小时数,如3pm
crontab(minute=0, hour=’*/3,8-17’) 8am-5pm能被3整除的
crontab(0, 0, day_of_month=’2’) 每月第2天
crontab(0, 0,day_of_month=’2-30/3’) 每偶数天
crontab(0, 0,day_of_month=’1-7,15-21’) 每月1和3周
crontab(0, 0, day_of_month=’11’,month_of_year=’5’) 每年5月11日
crontab(0, 0,month_of_year=’*/3’) 每个季度第1月

开启调度

开启celery定时服务:

$ celery -A proj beat

你也可以把定时器嵌入到工人(worker)中,通过启用workers -B选项,如果你永远不会运行超过一个工人节点这就会很方便。但这不太常见,不推荐在生产环境这样使用:

$ celery -A proj worker -B

定时器需要在本地数据库文件(默认名为 celerybeat-schedule )存储任务上次运行时间,所以它需要在当前目录中写权限。或者你也可以给这个文件指定一个位置:

$ celery -A proj beat -s /home/celery/var/run/celerybeat-schedule
1
0
查看评论

Celery 学习笔记(2)- 定时任务

周期任务Celery 中启动定时任务有两种方式,(1)在配置文件中指定;(2)在程序中指定
  • preyta
  • preyta
  • 2017-01-07 13:11
  • 3867

celery简明笔记

在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务。比如,在 Web 开发中,对新用户的注册,我们通常会给他发一封激活邮件,而发邮件是个 IO 阻塞式任务,如果直接把它放到应用当中,就需要等邮件发出去之后才能进行下一步操作,此时用户只...
  • lanmolei814
  • lanmolei814
  • 2017-12-29 15:25
  • 30

码农周刊分类整理

码农周刊的类别分的比较大,不易于后期查阅,所以我把每期的内容按语言或技术进行了分类整理。 码农周刊官方网址 http://weekly.manong.io/ 一些不熟悉的领域分类可能不准确,请见谅 15期为图书推荐,请直接浏览原地址 56期为14年最受欢迎列表,请直接浏览原地址 ...
  • Harrytsz
  • Harrytsz
  • 2017-02-27 20:40
  • 14363

celery 消息队列与定时任务

在进行定时获取代理ip, 黑名单ip,以及进行ip校验,相关信息及特征获取时,需要用到定时任务,常见的使用 linux 的crontab 来实现定时任务。但是为了在使用django,保持设计的一致性,就采用 celery 消息队列的定时任务来做。开发环境: centos 7 python3.5 ...
  • a1368783069
  • a1368783069
  • 2017-01-18 12:23
  • 1223

【转】分布式异步任务队列 Celery + rabbitmq (or redis )

最近的项目要使用异步的任务队列,初步选用了Celery,比较轻量级,但是对Task,Broker,Worker等概念有些理解的不透彻,找到以下文章,甚是透彻。 当我们需要处理一些比较耗时的任务时,我们就需要考虑启用“异步”这个概念。 比如以下两种情况:一,频繁读写 比如说,现在你一条“微博”,...
  • u011897301
  • u011897301
  • 2016-03-29 10:53
  • 1892

分布式任务队列 Celery —— 应用基础

目录 目录 前文列表 前言 Celery 的周期定时任务 Celery 的同步调用 Celery 结果储存 Celery 的监控 Celery 的调试 前文列表 分布式任务队列 Celery 分布式任务队列 Celery —— 详解工作流 前言 紧接前文,继续看 Ce...
  • Jmilk
  • Jmilk
  • 2018-01-28 17:54
  • 167

码农周刊分类整理

码农周刊的类别分的比较大,不易于后期查阅,所以我把每期的内容按语言或技术进行了分类整理。 码农周刊官方网址 http://weekly.manong.io/ 一些不熟悉的领域分类可能不准确,请见谅 15期为图书推荐,请直接浏览原地址 56期为14年最受欢迎列表,请直接浏览原地址 现在已整理...
  • yk19851111
  • yk19851111
  • 2016-09-21 17:06
  • 10229

使用celery中的schedule起定时任务,或叫计划任务

参看: http://stackoverflow.com/questions/5361521/celery-task-schedule-celery-django-and-rabbitmq celery 文档:http://docs.celeryproject.org/en/mast...
  • toontong
  • toontong
  • 2013-03-12 18:23
  • 5863

django-celery动态添加定时任务

为了使用celery替代crontab并做到实时添加定时任务的效果,需要使用django-celery,效果如下图, 来自:https://www.caktusgroup.com/blog/2014/06/23/scheduling-tasks-celery/  ...
  • Vintage_1
  • Vintage_1
  • 2015-08-14 17:00
  • 7067

Celery定时任务

Celery定时任务配置启用Celery的定时任务需要设置CELERYBEAT_SCHEDULE 。 Celery的定时任务都由celery beat来进行调度。celery beat默认按照settings.py之中的时区时间来调度定时任务。创建定时任务一种创建定时任务的方式是配置CELER...
  • sicofield
  • sicofield
  • 2016-03-20 16:59
  • 13405
    个人资料
    • 访问:9630次
    • 积分:359
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:14篇
    • 评论:3条