Django celery

celery.py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.  
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SchoolMS.settings')

app = Celery('SchoolMS')

# Using a string here means the worker will not have to  
# pickle the object when using Windows.  
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

init.py

from __future__ import absolute_import
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

setting.py

# 定时任务
broker_url = 'amqp://guest:guest@localhost:5672//'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERYBEAT_SCHEDULE = {
    'check_sms_remain_everyday': {
        'task': 'family.tasks.notify_if_sms_out',
        'schedule': crontab(minute=0, hour=10),
        'args': (),
    },
    'sms_reset': {
        'task': 'family.tasks.reset_sms_count',
        'schedule': crontab(minute=43, hour=17),
        'args': (),
    },
}

task.py

from celery import shared_task, task

@task
def reset_sms_count():
    sms_reset_date = get_value(settings.SMS_RESET_DATE_NAME)
    if sms_reset_date == datetime.now().day:
        for sms_assign in SMSAssign.objects.all():
            sms_assign.period_reset()
        Logger.objects.create(user=None, category=5, content='系统重置短信分配')

命令:

python manage.py celery beat -l info # 启动任务发送端
python manage.py celery worker -l info # 启动任务处理端 worker

重启worker才能使task装饰过的代码在修改过后改成修改之后的版本,不然一直运行的是修改前的版本,类似于apache。

在setting.py 中修改CELERYBEAT_SCHEDULE要求重启beat和worker才能即时生效

安装、使用RabbitMQ:

windows需要下载安装软件,Linux直接apt-get

http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq

sudo apt-get install rabbitmq-server

生产环境部署参见 Supervisor使用笔记及celery生产部署

windows定时关机 cmd输入:

at 23:00 shutdown -s 

要取消ID为1的关机计划:

at 1 /delete