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), }, }