CELERY 定时任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CELERY 定时任务相关的知识,希望对你有一定的参考价值。

参考技术A Celery是一个强大的分布式任务队列,他可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。通常用来实现异步任务和定时任务。异步任务比如发送邮件,文件上传图像处理等;定时任务就是需要在特定时间执行的任务。

a. 创建Celery实例
b. 启动Celery Worker,通过delay()或者apply_async()将任务发布到broker
c. 应用程序调用异步任务
d. 存储结果
Celery Beat: 任务调度器,Beat进程会读取配置文件的内容,周期性的将配置中到期需要执行的任务发送给任务队列

a. 创建Celery实例
b. 配置文件中配置任务,发送任务 celery -A xxx beat
c. 启动Celery Worker celery -A xxx worker -l info -P eventlet
d. 存储结果

如果大写的话,需要写成:

在celery_task同级目录下,执行命令:
celery -A celery_task beat

在celery_task同级目录下,执行命令:
celery -A celery_task worker -l info -P eventlet
可以看到输出:

如果同时在<b>两个虚拟环境(服务器)</b>中都执行定时任务,都可以看到有以上LOG打印。

发布任务
celery -A celery_task beat
执行任务
celery -A celery_task worker -l info -P eventlet
将以上两条合并
celery -B -A celery_task worker
后台启动celery worker进程
celery multi start work_1 -A appcelery
停止worker进程,如果无法停止,加上-A
celery multi stop WORKNAME
重启worker进程
celery multi restart WORKNAME
查看进程数
celery status -A celery_task

Celery学习--- Celery操作之定时任务

celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat

文件定时执行任务

项目前提: 安装并启动Redis

技术分享图片

celery_Schedule.py

# version: python3.2.5
# author: ‘lft415659‘
from celery import Celery
from celery.schedules import crontab  # 可以实现复杂的定时任务
app = Celery(‘CelerySchedule‘,
             # redis://:[email protected]:port/db_number  有密码认证的连接
             broker=‘redis://192.168.2.105‘,
             # broker=‘redis://:密码@192.168.2.105:6379/0‘,
             backend=‘redis://192.168.2.105‘,  # 用于Celery的返回结果的接收
             )

# 创建定时任务
@app.on_after_configure.connect     # 启动程序连接上celery后自动执行这个函数生成定时任务
def setup_periodic_tasks(sender, **kwargs):  # 第一次参数必须是sender,是定时任务的一个实例
    # Calls test(‘hello‘) every 10 seconds.   这里的test是我们自定义的函数
    sender.add_periodic_task(10.0, test.s(‘hello‘), name=‘add every 10‘)

    # Calls test(‘world‘) every 30 seconds
    sender.add_periodic_task(30.0, test.s(‘world‘), expires=10)

    # Executes every Monday morning at 7:30 a.m.  更复杂的定时任务
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s(‘Happy Mondays!‘),
    )

@app.task
def test(arg):
    print(‘run task:‘, arg)

后台启动Celery的worker任务:

[email protected]:~$ cd Celery      
[email protected]:~/Celery$ vim celery_Schedule.py
[email protected]:~/Celery$ celery -A celery_Schedule worker -l info

技术分享图片

启动定时任务调度器[celery beat]

[email protected]chine:~/Celery$ celery -A celery_Schedule beat

技术分享图片

更复杂的定时任务

上面的定时任务比较简单,只是每多少s执行一个任务,但如果你想要每周一三五的早上8点给你发邮件怎么办呢?哈,其实也简单,用crontab功能,跟linux自带的crontab功能是一样的,可以个性化定制任务执行时间

【linux crontab】http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html 

【更多参考】http://www.cnblogs.com/alex3714/articles/6351797.html

from celery.schedules import crontab

app.conf.beat_schedule = {
    # Executes every Monday morning at 7:30 a.m.
    ‘add-every-monday-morning‘: {
        ‘task‘: ‘tasks.add‘,
        ‘schedule‘: crontab(hour=7, minute=30, day_of_week=1),
        ‘args‘: (16, 16),
    },
}

像配置文件一样定时执行任务【用的比较少】

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

以上是关于CELERY 定时任务的主要内容,如果未能解决你的问题,请参考以下文章

Celery实现定时任务crontab

celery 定时任务

celery定时任务

Celery 源码解析四: 定时任务的实现

Celery定时任务细讲

Celery - 一个懂得 异步任务 , 定时任务 , 周期任务 的芹菜