任務調度:
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沒有所以可以參考它來完成同樣的功能.