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