此篇主要解講定時任務的部份
執行環境
* python 3.7.4
* django 2.1.7
* celery 4.4.7
* django-redis 4.12.1 (本篇用redis當作中間人)
必須先安裝redis服務,再進行以下
目錄結構
| manage.py
\---ProjectName
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
★ celery.py
\---AppName
task.py (名稱task為預設)
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from celery.schedules import crontab
from datetime import timedelta
from kombu import Queue # 用於多任務列隊
# django_DRF 為專案名稱
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django_DRF.settings')
# 使用redis作為中間人(broker)
# 使用redis作為定時任務存取地方(backend)
# 預設redis為本地127.0.0.1:6379/1(redis)
# ★★★ 此處須注意(若本地沒有redis卻設置redis預設 -> 則會顯示10061連線錯誤)
app = Celery('Django_DRF', backend='redis://127.0.0.1:6379/14', broker='redis://127.0.0.1:6379/15')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# 預設任務名稱為tasks用意為此,此行會加載已經有註冊的app.task.py檔案
app.autodiscover_tasks()
# 設定任務進入哪個列隊 (在開啟worker時,可以分別進行)
app.conf.task_routes = {
'AppName1.tasks.TF_postingJob': {
'queue': 'tasks_one'
},
'AppName2.tasks.MLO_dailyDataJob': {
'queue': 'tasks_two'
}
}
# 設定列隊路由
app.conf.task_queues = (
Queue('tasks_one', routing_key='tasks_one'),
Queue('tasks_two', routing_key='tasks_two'),
)
# 允許root用戶運行celery
platforms.C_FORCE_ROOT = True
# 有出錯會顯示於此
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
# 固定的定時任務
app.conf.update(
CELERYBEAT_SCHEDULE = {
'JobName': { # 任務名稱
'task': 'app.tasks.functionName', # 執行的任務
'schedule': timedelta(seconds=5), # 週期多久一次
'args': () # 此處可帶參數
}
}
)
# celery指定的任務檔案,只能叫做task.py
# 於此加入所需要執行的程序
from __future__ import absolute_import
from celery import shared_task
from channels.layers import get_channel_layer
from .timelyService import *
@shared_task
def MLC_postingJob():
print('test')
定時任務需在開啟beat服務(borker)
celery beat -A projectName -l info
開啟worker執行broker下達的任務
celery -A Django_DRF worker --pool=solo -l info
# 1.開啟CMD輸入以下
celery -A Django_DRF worker --pool=solo -l info -Q tasks_one # tasks_one 為該worker需要執行的列隊內容。