1. 程式人生 > >django —— Celery實現異步和定時任務

django —— Celery實現異步和定時任務

not 1.10 掃描 pick scheduler 建議 inux data rtc

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")

  • 啟動djangocelery
# 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_taskcrontabinterval設置每5s執行一次

  • 啟動django和celery, 並查看日誌
  • celery -A Demo worker -l debug
    
    # 另一個窗口
    celery -A Demo beat -l debug --max-interval=10  # 每10s掃描一次djcelery任務

nohup 後臺啟動

nohup celery -A Demo worker -l debug > abc.log &

django —— Celery實現異步和定時任務