#celery#周期性任务

玩了一个星期的clannad,是时候干点事了。

折腾了下celery周期性任务:

celery提供了一个叫celery beat的服务,用于定时驱使worker执行任务。也就是说,如果本地没有活动的worker,它将不会得到任何执行结果,他只是负责把任务消息传到rabbitmq,一旦启动一个可用worker,则自动从rabbitmq获取任务信息并执行。

与此配置相关的参数是CELERYBEAT_SCHEDULE,我把我的celery应用proj的所有配置内容都放置在一个config.py文件中:

from __future__ import absolute_import
from datetime import timedelta
from celery.schedules import crontab

CELERY_TASK_RESULT_EXPIRES=3600
CELERY_TASK_SERIALIZER=‘json‘
CELERY_ACCEPT_CONTENT=[‘json‘]
CELERY_RESULT_SERIALIZER=‘json‘

CELERYBEAT_SCHEDULE = {
    ‘add-every-1-min‘: {
        ‘task‘: ‘proj.agent.add‘,
        ‘schedule‘: crontab(),
        ‘args‘: (16, 16),
    },
}
#CELERYBEAT_SCHEDULE = {
#    ‘add-every-2-seconds‘: {
#        ‘task‘: ‘proj.agent.add‘,
#        ‘schedule‘: timedelta(seconds=3),
#        ‘args‘: (16, 16)
#    },
#}

CELERY_TIMEZONE = ‘UTC‘

目前的定时任务是:

add-every-4-s

task指定了相应的任务:proj目录下agent模块的add函数

schedule指定了定时工具,这里是celery.schedules的crontab

args是任务的参数

此时我们回到proj所在的目录中,启动一个worker:

[email protected]:~/celeryapp/configtest# ls
celerybeat-schedule  logging  proj
[email protected]:~/celeryapp/configtest# celery -A proj worker --loglevel=INFO
/usr/local/lib/python2.7/dist-packages/celery/platforms.py:766: RuntimeWarning: You are running the worker with superuser privileges, which is
absolutely not recommended!

Please specify a different user using the -u option.

User information: uid=0 euid=0 gid=0 egid=0

  uid=uid, euid=euid, gid=gid, egid=egid,
 
 -------------- [email protected]roup0.hzg.com v3.1.17 (Cipater)
---- **** ----- 
--- * ***  * -- Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         proj:0x7f0027635510
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     amqp://[email protected]//
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- 
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery
                

[tasks]
  . proj.agent.add
  . proj.agent.mul
  . proj.agent.writefile
  . proj.agent.xsum

[2015-05-24 15:00:37,873: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2015-05-24 15:00:37,940: INFO/MainProcess] mingle: searching for neighbors
[2015-05-24 15:00:38,980: INFO/MainProcess] mingle: all alone
[2015-05-24 15:00:39,021: WARNING/MainProcess] [email protected] ready.

worker启动成功,此时再开一个终端,启动beat服务:

[email protected]:~/celeryapp/configtest# celery -A proj beat -s celerybeat-schedule
celery beat v3.1.17 (Cipater) is starting.
__    -    ... __   -        _
Configuration ->
    . broker -> amqp://guest:**@localhost:5672//
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> celery.beat.PersistentScheduler
    . db -> celerybeat-schedule
    . logfile -> [stderr]@%INFO
    . maxinterval -> now (0s)
[2015-05-24 15:02:53,761: INFO/MainProcess] beat: Starting...
[2015-05-24 15:03:00,000: INFO/MainProcess] Scheduler: Sending due task add-every-1-min (proj.agent.add)

#已经相隔1min了

[2015-05-24 15:04:00,066: INFO/MainProcess] Scheduler: Sending due task add-every-1-min (proj.agent.add)

返回看看worker的输出:

[2015-05-24 15:01:50,827: INFO/MainProcess] Task proj.agent.add[9b6f962a-9b66-4fde-916f-fc5a951ad599] succeeded in 0.0342152439989s: {‘value‘: ‘32‘}
[2015-05-24 15:02:24,923: INFO/MainProcess] Received task: proj.agent.add[e4b9840b-09f6-4db6-88c1-2a418b11d393]
[2015-05-24 15:02:24,947: INFO/MainProcess] Task proj.agent.add[e4b9840b-09f6-4db6-88c1-2a418b11d393] succeeded in 0.0200459280004s: {‘value‘: ‘32‘}
[2015-05-24 15:03:00,015: INFO/MainProcess] Received task: proj.agent.add[98f44dd1-e6e2-4457-bfd6-ff59d0ee6d2f]
[2015-05-24 15:03:00,031: INFO/MainProcess] Task proj.agent.add[98f44dd1-e6e2-4457-bfd6-ff59d0ee6d2f] succeeded in 0.0125673500006s: {‘value‘: ‘32‘}

这就是周期性任务的执行。

遇到的坑:

在配置文件中,from __future__ import absolute_import这一行很关键,如果没有这一行,

from celery.schedules import crontab

这个命令执行时会报错,celery beat无法正常启动。

补充:

默认情况下,celery beat使用UTC时区,你也可以配置其他时区:

CELERY_TIMEZONE = ‘Europe/London‘

关于设置任务执行周期,你可以通过datetime的timedelta设置,可以让任务执行间隔精确到秒,相应的配置如下:

CELERYBEAT_SCHEDULE = {
    ‘add-every-2-seconds‘: {
        ‘task‘: ‘proj.agent.add‘,
        ‘schedule‘: timedelta(seconds=3),
        ‘args‘: (16, 16)
    },
}

也可以用crontab风格的:

CELERYBEAT_SCHEDULE = {
    # Executes every Monday morning at 7:30 A.M
    ‘add-every-1-min‘: {
        ‘task‘: ‘proj.agent.add‘,
        ‘schedule‘: crontab(),
        ‘args‘: (16, 16),
    },
}

关于一个CELERYBEAT_SCHEDULE的可以配置的参数,以及crontab的详细示例,请参见celery官方文档。

关于启动celery beat的tips,我这里只贴原文:

Starting the Scheduler

To start the celery beat service:

$ celery -A proj beat

You can also start embed beat inside the worker by enabling workers -B option, this is convenient if you will never run more than one worker node, but it’s not commonly used and for that reason is not recommended for production use:

$ celery -A proj worker -B

Beat needs to store the last run times of the tasks in a local database file (namedcelerybeat-schedule by default), so it needs access to write in the current directory, or alternatively you can specify a custom location for this file:

$ celery -A proj beat -s /home/celery/var/run/celerybeat-schedule
时间: 2024-11-07 11:28:33

#celery#周期性任务的相关文章

Django实现异步定时任务

Celery(芹菜) 这个翻译之后居然叫芹菜~~~~好吧~~挺补的~~~最近Django框架需要涉及到执行定时周期任务~~之前想用线程方法的~发现好像不会尴尬~~~然后又想用“django_crontab”来执行的毕竟这个学习周期短~~但是不好用啊发现,最后还是决定花时间来学学~~芹菜. Celery是Python语言实现的分布式队列服务,除了支持即时任务,还支持定时任务. Celery中的五个核心角色 Task 任务(Task)就是你要做的事情,例如一个注册流程里面有很多任务,给用户发验证邮件

基础入门_Python-模块和包.深入Celery之Beat触发定时/周期性任务?

任务调度: 1. Celery默认任务单元由任务生产者触发,但有时可能需要其自动触发,而Beat进程正是负责此类任务,能够自动触发定时/周期性任务. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date    : 2016-12-24 17:32:54 # @Author  : 李满满 ([email protected]) # @Link    : http://xmdevops.blog.51cto.com/ # @Version : $

Celery 使用(一)

Celery 使用(一) 架构 Producer:任务发布者: Celery Beat:任务调度器,Beat进程会读取配置文件中的内容,周期性的将配置中到期需要执行的任务发送给任务队列: Broker:消息代理,接受生产者的任务消息,存进队列后发送给消费者: Celery Worker:执行任务的消费者: Result Backend:保存消费者执行任务完后的结果: 如下图: 整体的流程,任务发布者或者是任务调度,将任务发送到消息代理中,接着消息代理将任务发送给消费者来执行,其执行完后将结果保存

使用celery之了解celery(转)

原文  http://www.dongwm.com/archives/shi-yong-celeryzhi-liao-jie-celery/ 前言 我想很多做开发和运维的都会涉及一件事:crontab, 也就是在服务器上设定定时任务,按期执行一些任务.但是假如你有上千台的服务器, 你有上千种任务,那么对于这个定时任务的管理恐怕是一件很头疼的事情.哪怕你只是几十个任务分配的不同的机器上怎么样合理的管理和实现以下功能呢: 查看定时任务的执行情况.比如执行是否成功,当前状态,执行花费的时间. 一个友好

并行Python框架Celery的配置方法

1.Configuration Celery,作为一个consumer工具不需要太多的操作.它有输入和输出通道,通过输入通道连接到broker(如AMQP服务Channel)或者通过输出通道连接到结果的backend(用于获取结果,不是必须的,因为有的操作只是单向分发任务). 这一些控制通过制定一些配置参数来完成. 缺省的配置对大多数使用场景已足够,但很多时候可能需要自己的设置.熟悉可配置的选项是一个好主意这里是参考:Configuration and defaults . 配置可以在应用里直接

使用celery的backend异步获取结果

惯例先贴出相关参考的文档: http://docs.celeryproject.org/en/stable/getting-started/next-steps.html http://docs.celeryproject.org/en/stable/userguide/tasks.html#task-result-backends 这篇紧接上篇. 其实我们一般对这种异步任务需求是可能需要回调的.比如说我现在有一个支付的异步任务发送到了队列. 生产者不需要等待,在发送到队列之后就告诉用户已经支付

celery简介

Celery简介 [toc] celery userguide 知乎大神解释celery Celery(芹菜)是基于Python开发的分布式任务队列.它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度. Celery架构 架构图如下: Celery包括如下组件: Celery Beat 任务调度器,Beat进程会读取配置文件的内容,周期性的将配置中到期需要执行的任务发送给任务队列 celery Worker 执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率 Broke

Python 并行分布式框架 Celery

Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分布式决定了可以有多个 worker 的存在,队列表示其是异步操作,即存在一个产生任务提出需求的工头,和一群等着被分配工作的码农. 在 Python 中定义 Celery 的时候,我们要引入 Broker,中文翻译过来就是"中间人"的意思,在这里 Broker 起到一个中间人的角色.在工头提

【转】Python 并行分布式框架 Celery

原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/ celery配置:http://docs.jinkan.o