要定时或者周期性的执行任务,可以使用linux的crontab。Celery也提供了类似的Periodic Tasks功能。

Celery beat

Celery使用celery beat作为任务调度器,周期性的启动任务。

需要执行的任务默认是在beat_schedule配置选项中设置的。使用django-celery-beat时,也可以使用数据库存储。

需要保证同一时间只有一个任务调度器在运行,否则会重复的执行任务。

Time Zones

既然是任务与时间有关,那么时区设置是很重要的。Celery默认使用UTC时区,要改变默认时区,可以配置:

timezone = Asia/Shanghai'

在django项目中使用celery时,celery也可以使用setting的TIME_ZONE时区设置。

使用默认的任务调度器时,celery会自动识别时区的改动,然后重置任务调度。使用其它任务调度时,需要手动重置。

比如,使用django-celery-beat时:

$ python manage.py shell
>>> from djcelery.models import PeriodicTask
>>> PeriodicTask.objects.update(last_run_at=None)

Entries

要添加周期任务,需要将事务添加到任务调度器中,添加方法有两种。

一种是使用add_periodic_task() 方法:

from __future__ import absolute_import, unicode_literals

from celery.schedules import crontab

from .celery import app

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# Calls add(1, 2) every 10 seconds.
sender.add_periodic_task(10.0, add.s(1, 2), name='add every 10') # Calls add(3, 4) every 30 seconds
sender.add_periodic_task(30.0, add.s(3, 4), ) # Executes every Monday morning at 7:30 a.m.
sender.add_periodic_task(
┆ crontab(hour=7, minute=30, day_of_week=1),
┆ add.s(1, 2),
) @app.task
def add(x, y):
print x + y
return x + y

另一种方法是配置beat_schedule选项:

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

可用字段:

task:需要执行的任务名称

schedule:任务执行时间设定,可以是整秒数,一个timedelta对象,或者一个crontab对象,也可以自己实现。

args:一个元组或者列表,位置参数

kwargs:一个字典,关键字参数

options:一个字典,一些额外选项,apply_async()方法可用的参数,exchange, routing_key, expires等

relative:默认false

Crontab

class celery.schedules.crontab(minute=u'*'hour=u'*'day_of_week=u'*'day_of_month=u'*'month_of_year=u'*'**kwargs)

一个表示时间间隔的对象,语法与linux的crontab类似。

minute和hour可以设置为*/15,*/2,分别表示每隔15分钟和每隔2小时。

day_of_week用可以0-6的数字表示,也可以文字表示mon-fri。*/2并不是每2天,而是每半天。

官网一些具体例子:

crontab()  每分钟

crontab(minute=0, hour=0)  每天的0时0分

crontab(minute=0, hour='*/3')  每三小时

crontab(day_of_week='sunday')  周日的每一小时

crontab(minute='*',hour='*', day_of_week='sun') 与上面相同

crontab(minute=0, hour='*/3,8-17') 每三个小时  8时到17时的每小时

Solar

可用日升日落表示的时间间隔:

from celery.schedules import solar

app.conf.beat_schedule = {
# Executes at sunset in Melbourne
'add-at-melbourne-sunset': {
'task': 'tasks.add',
'schedule': solar('sunset', -37.81753, 144.96715),
'args': (16, 16),
},
}

语法是solar(event, latitude, longitude)

event表示日落日出,latitude为纬度,北纬为+,longitude为经度,东经为+。

启动

启动celery beat周期任务命令:

$ celery -A proj beat

然后启动worker节点来处理任务即可。

beat与worker也可以同时启动,但最好只用于测试,适用于只启动一个worker节点的情况:

$ celery -A proj worker -B

beat会在当前目录下建立一个文件celerybeat-schedule来记录任务上次运行的时间,所以要保证celery对当前目录有写入的权限,或者指定文件位置:

$ celery -A proj beat -s /home/celery/var/run/celerybeat-schedule

  

Celery(四)定时任务的更多相关文章

  1. Django中使用Celery实现定时任务(用djcelery)

    一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...

  2. Celery完成定时任务

    1.什么是Celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 celery支持linux,如果windows使用celery ...

  3. django+celery 实现定时任务

    利用 celery 实现定时任务 celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat Celery安装 由于celery 4. ...

  4. 三、celery执行定时任务

    三.Celery执行定时任务 设定时间让celery执行一个 定时任务,product_task.py from celery_task import send_email from datetime ...

  5. django celery redis 定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

  6. Django 异步化库celery和定时任务

    首先要了解Django其实是个同步框架,那么多个用户发送请求时就会发生排队的情况上一个用户的请求完成后在进行下一个,这样会对影响用户体验,所有就要用到异步方法来解决. 首先我们要安装celery库 p ...

  7. flask + celery实现定时任务和异步

    参考资料: Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest ...

  8. celery 动态定时任务探索

    环境: celery 4.3 flask python 3.7 linux 需求: 动态添加定时任务,且方便维护. 解决思路: 参考django-celery 或是celery源码,将定时任务配置放置 ...

  9. celery的定时任务

    定时任务 Celery 中启动定时任务有两种方式,(1)在配置文件中指定:(2)在程序中指定. # cele.py import celery app = celery.Celery('cele', ...

随机推荐

  1. for循环,for in和for of的区别

    最近在写代码,总在被烦恼着到底遍历的时候到底该使用for循环,还是使用for in或者for of  ,今天查了以下 ,写出来. 我们一般用for循环来遍历数组,因它可以按顺序的返回每一个索引的值或者 ...

  2. vue-cli 安装失败Failed to download repo vuejs-templates/webapck-simple: Response code 404 (Not Found)

    新学习vue的萌新们经常会遇到各种各样的坑.例如上面这个报错.这个一般是命令行面板写错单词导致. 正确:vue init webpack-simple .(注意"."点,指当前目录 ...

  3. Material04 MdCardModule和MdButtonModule综合运用

    设计需求:设计一个登陆页面 1 模块导入 1.1 将MdCardModule和MdButtonModule模块导入到共享模块中 import { NgModule } from '@angular/c ...

  4. 指尖上的电商---(4).net开发solr

    这一节我们看下如何把查询数据放到server端存储,这里我们须要使用client工具来操作与服务端数据打交道,网上有好多基于.NET开发的SOLRclient,我们这里选择easynet.solr,非 ...

  5. hdu 4939

    题意: 长度为n个单位的map,每一个单位须要时间t来走完. 每一个单位能够放置一个塔.一共同拥有三种塔,每种塔的作用不同: 1.仅仅能攻击当前单位.每秒x点伤害(红塔) 2.攻击当前单位之后的全部单 ...

  6. HTML学习笔记之三(localstorage的使用)

    localstorage的使用 1.获取对象 var localstroage = window.localStorage; 2.存储值 localstroage.setItem('openid',' ...

  7. python抓取历年特码开奖记录

    背景: 小时候,有种游戏,两个主人公:白XX和曾XX,每个家庭把他俩像活菩萨一样供着,供他们吃,供他们穿 做生意的老板为了这两位活菩萨,关门大吉 农民为了这两位活菩萨卖牛卖田变卖家产 做官的为了这两位 ...

  8. Python 项目实践一(外星人入侵)第一篇

    python断断续续的学了一段实践,基础课程终于看完了,现在跟着做三个小项目,第一个是外星人入侵的小游戏: 一 Pygame pygame 是一组功能强大而有趣的模块,可用于管理图形,动画乃至声音,让 ...

  9. 腾讯云安全:移动 APP 安全行业报告

    移动 APP 已逐步渗透入我们的生活,据统计,2016年,APP 发行数量仅电商.金融.游戏这三大类共计高达2万左右,国内移动互联网活跃用户数已经突破10亿,移动互联网这样快速的推移,移动互联网的安全 ...

  10. 结对编程-四则运算GUI的实现

    一.项目成员以及coding地址: 洪灏捷(本人)201321122020  coding地址:https://git.coding.net/hoje/The-GUI-operation.git 白至 ...