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

一、celery.py

from __future__ import absolute_import

import os

from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')
app = Celery('django_celery')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

 二、配置文件

# coding: utf-8
from datetime import timedelta

import djcelery

djcelery.setup_loader()
BROKER_URL = 'amqp://guest@localhost//'  #输入
CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'  #返回的结果

#导入指定的任务模块
CELERY_IMPORTS = (
    'fir.app.fir.tasks',
)

#定时任务
CELERYBEAT_SCHEDULE = {
    'receive_mail': {
        "task": "fir.app.fir.tasks.receive_mail",
        "schedule": timedelta(seconds=5),  #每5秒执行一下receive_mail函数
        "args": (),  #参数
    },
}

三、task.py

# coding: utf-8

from __future__ import unicode_literals, absolute_import

from celery.task import task

from fir.app.fir.models import FirReport, FirManagement, Attachment


@task
def receive_mail():
    managers = FirManagement.objects.filter(status='launched')
    for manager in managers:
        msg_id, sender, subject, content,  attach_list = manager.receive_mail()
        print attach_list
        if not FirReport.objects.filter(msg_id=msg_id):
            context = {
                'name': sender,
                'subject': subject,
                'content': content,
                'msg_id': msg_id,
                'firmanagement': manager,
                'is_attachment': True if attach_list else False,
            }
            firreport = FirReport.objects.create(**context)

            if context['is_attachment']:
                Attachment.objects.create(firreport=firreport)

    # TODO 调用外部引擎接口
@task
def add(x ,y):
  return x+y

 任务添加好了,需要让celery单独启动一个进程来定时发起这些任务, 注意, 这里是发起任务,不是执行,这个进程只会不断的去检查你的任务计划, 每发现有任务需要执行了,就发起一个任务调用消息,交给celery worker去执行

启动任务调度器 celery beat

$ celery -A periodic_task beat -l info

此时还差一步,就是还需要启动一个worker,负责执行celery beat发起的任务

$ celery -A periodic_task worker

 

此时观察worker的输出,是不是每隔一小会,就会执行一次定时任务呢!

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

rom celery.schedules import crontab
 
CELERYBEAT_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),
    },
}

 

posted on 2018-10-23 15:48  海燕。  阅读(10615)  评论(0编辑  收藏  举报