使用celery實現定時任務


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM