Django框架17: Celery的使用

Celery介紹html

1.什麼是Celery
    Celery是一個python模塊,它在官網的定義:Celery is asynchronous task queue/job based on distributed message passing. It is focused on real-time operation, but supports scheduling as well. 
    這裏強調的概念包括:異步任務隊列,分佈式消息傳遞,實時或調度任務。python

2.爲何要使用Celery
    Celery是一個使用Python開發的分佈式任務調度模塊,所以對於大量使用Python構建的系統,能夠說是無縫銜接,使用起來很方便。Celery專一於實時處理任務,同時也支持任務的定時調度。所以適合實時異步任務定時任務等調度場景。git

3.Celery任務隊列
    任務隊列是一種在進程或機器之間分發任務的機制。  
    任務隊列的輸入是被稱爲任務(task)的工做單元。專用的工做進程會時刻監控任務隊列,來獲取要執行的任務。 
    celery的client和worker經過消息來「溝通「。Celery須要依靠RabbitMQ等做爲消息代理,同時也支持Redis甚至是Mysql,Mongo等,固然,官方默認推薦的是RabbitMQ。
    爲了開始一個任務,client須要向隊列中發送任務消息,而後broker會把任務投遞給worker處理。一個celery系統能夠包含多個worker和broker,以便實現高可用和可水平擴展。github

4.官方網站:http://www.celeryproject.org/redis

5.中文文檔:http://docs.jinkan.org/docs/celery/sql

Celery配置shell

參考Github實踐例子:https://github.com/celery/celery/tree/3.1/examples/djangodjango

1.在包含settings文件夾proj的__init__.py中添加json

# proj/__init__.py
from __future__ import absolute_import
from .celery import app as celery_app

2.一樣在該文件夾中建立celery.py文件。bash

# proj/celery.py
# coding:utf8
from __future__ import absolute_import

import os

from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

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

3.在settings.py文件中,添加一些celery的配置。

# 修改點1
INSTALLED_APP += [
    'kombu.transport.django',
    'djcelery'
]

# 修改點2
# 生產環境我使用redis做爲broker
BROKER_URL = 'redis://172.23.18.116:6379/0'
# 開發環境能夠直接用django做爲broker
BROKER_URL = 'django://'

# 修改點3
#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html)
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

4.作好上面的步驟以後,就能夠在本身的app中新增tasks.py文件,裏面用shared_task來裝飾celery任務,如demoapp/tasks.py。

from __future__ import absolute_import
from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)

celery測試及使用

1.首先啓動worker。

# 這裏指定了配置,默認的話忽略info後面
python manage.py celery worker --loglevel=info --settings=proj.settings

2.使用下面的命令也就是在django環境中執行,經常使用來測試django模塊功能。

# 同上忽略指定的配置文件
python manage.py shell --settings=proj.settings

    試着執行shared_task add()。

from demoapp.tasks import add
add.delay(3, 3)

    上面的worker log中出現add()的return也就是6,說明celery配置正確。

3.django-celery的定時任務功能
    這一步是celery beat定時或者定間隔給celery發送task。

# proj/settings.py
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'12

    接下來,將目標djcelery的定時文件遷移一下,便可在admin後臺配置定時任務時間間隔等內容。

python manage.py migrate

    再而後

python manage.py celery beat

    能夠看到celery beat開始按以前admin後臺設置的時間間隔或者crontab開始發送task給celery了,此時天然也須要celery worker在running狀態。celery beat發送的任務return的結果在celery log中能夠看到,說明django-celery 定時任務配置成功。

原文出處:https://www.jzfblog.com/detail/115,文章的更新編輯以此連接爲準。歡迎關注源站文章!

相關文章
相關標籤/搜索