基礎入門_Python-模塊和包.深入Celery之Beat觸發定時/週期性任務?

任務調度:

1. Celery默認任務單元由任務生產者觸發,但有時可能需要其自動觸發,而Beat進程正是負責此類任務,能夠自動觸發定時/週期性任務.


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2016-12-24 17:32:54
# @Author  : 李滿滿 ([email protected])
# @Link    : http://xmdevops.blog.51cto.com/
# @Version : $Id$
from __future__ import absolute_import
# 說明: 導入公共模塊
from datetime import timedelta
from kombu import Queue, Exchange
from celery.schedules import crontab
# 說明: 導入其它模塊
# BROKER_URL = 'amqp://root:[email protected]:5672//'
# CELERY_RESULT_BACKEND = 'redis://172.24.10.1:6379/0'
BROKER_URL = 'amqp://root:[email protected]:5672//'
CELERY_RESULT_BACKEND = 'redis://10.2.5.51:5123/0'
CELERY_TASK_SERIALIZER = 'msgpack'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
CELERY_ACCEPT_CONTENT = ['json', 'msgpack']
CELERYD_MAX_TASKS_PER_CHILD = 40
CELERYBEAT_SCHEDULE = {
    'send_mail': {
        'task': 'work.notify.email.send_mail',
        # 'schedule': timedelta(minute=1),
        'schedule': crontab(minute='*/1'),
        'args': ('usr', 'sub', 'msg')
    }
}

說明: 任務調度主要是爲了解決業務場景中定時或週期任務,分別使用timedelta和crontab來定義計劃任務,crontab的精度無法精確到秒時可使用timedelta代替,CELERYBEAT_SCHEDULE下可以定義多個計劃/週期任務,send_mail爲任務名稱,task爲任務單元導入名,schedule爲具體調度,args爲任務單元的參數.

注意: 運行時可先啓動work進程池(celery worker -A work.app -l info)然後再啓動beat進程池(celery beat -A work.app -l info),觀察會發現beat進程每分鐘生成一個任務,work進程發現任務後立即執行

擴展: Django-celery可實現在管理後臺添加,刪除,更新任務,是因爲它使用了自定義的調度類djcelery.schedulers.DatabaseScheduler,Flask沒有所以可以參考它來完成同樣的功能.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章