django —— Celery實現非同步和定時任務
阿新 • • 發佈:2019-01-30
1. 環境
python==2.7
djang==1.11.2 # 1.8, 1.9, 1.10應該都沒問題
celery-with-redis==3.0 # 需要用到redis作為中間人服務(Broker)
celery==3.1.25 # 安裝上面的會自動安裝
kombu==3.0.37
billiard==3.3.0.23
django-celery==3.2.2 # celery外掛, 實現定時任務
celery>=4.0 對此環境會有報錯, 暫不建議在此環境下使用
2. 安裝
pip install django==1.11.2 celery-with -redis==3.0 django-celery==3.2.2
3. 安裝Redis, 用作Broker (RabbitMQ 官方推薦, 但安裝麻煩點)
教程很多, 略
4. 新建django專案
- Demo
- Demo
setting.py
wsgi.py
urls.py
- app
- migrations
models.py
views.py
...
- 配置
settings.py
INSTALLED_APPS = (
...
'app',
'djcelery' ,# django-celery 可以在admin後臺定義定時任務, 開始前需要直接migrate
)
BROKER_URL = 'redis://127.0.0.1:6379/0'
BROKER_TRANSPORT = 'redis'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 資料庫排程
- 新建檔案
Demo/Demo/celery.py
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Demo.settings')
from django.conf import settings # noqa
app = Celery('Demo')
# 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)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
- 新建
Demo/app/tasks.py
from Demo.celery import app
@app.task
def cus_task(*arg):
print('This is a test task')
- 編輯
Demo/app/views.py
from django.shortcuts import render, HttpResponse
from .tasks import cus_task
def index(request):
cus_task.delay()
return HttpResponse("Test async task")
- 啟動
django
和celery
# django
python manage.py runserver
# celery
celery -A Demo worker -l debug
admin後臺中配置celery
計劃
- 配置
# 如上settings.py中的設定, 後執行
python manage.py migrate djcelery
- 登陸admin後臺進行配置
# Djcelery模組列表
Crontabs # 同linux crontab
Intervals # 間隔
Periodic tasks # 週期任務
Tasks
Workers
配置一個
periodic task
任務內容app.tasks.cus_task
用crontab
或interval
設定每5s執行一次
- 啟動django和celery, 並檢視日誌
celery -A Demo worker -l debug
# 另一個視窗
celery -A Demo beat -l debug --max-interval=10 # 每10s掃描一次djcelery任務