Django Celery初識
對於任務排程的實現方案,其實開源的專案有很多。
我先說說對於任務排程的認識,如果從資料庫層面來說,任務排程就是scheduler,這一點在Oracle中體現的更為細緻。
Oracle中建立scheduler,在後臺執行JOB完成資料的處理,基本上會把一個任務拆分成不同的幾個維度屬性。
可以參考之前的一篇文章:
結合EM快速解決複雜的配置問題(r4筆記第91天)
而如果任務很多,有大批次的任務需要處理,而且任務位於不同的伺服器環境中,那麼這個複雜度就會大大增加,所以引入訊息佇列的方式就是一個很自然的方式。
訊息佇列目前有很多種可選方案,比如Redis,RabbitMQ等,根據自己的需求滿足要求即可。
首先我們需要確認celery已正常安裝。
>pip list|grep celery
celery (3.1.20)
celery-with-redis (3.0)
django-celery (3.2.2)
如果是在Django中在較新的版本中,也是自帶的,我們來快速體驗一下Django Celery的功能。
建立一個專案
django-admin startproject django_celery
初始化一個應用
cd django_celery
django-admin startapp celery_app
我們修改settings.py的配置。
在這裡需要說明的是,如果我們不用Redis,RabbitMQ的話,測試使用自帶的broker服務也是可以的。
如果啟用自帶的配置,settings.py的配置如下:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'celery_app',
'djcelery',
'kombu.transport.django',
)
BROKER_URL = 'django://localhost:8000//'
如果是用RabbitMQ,我們需要單獨部署安裝這個訊息佇列,可用
yum install rabbitmq-server即可,本身這個專案是用erlang開發的,所以會安裝大量的erlang相關的包。
settings.py的配置如下:
import djcelery
djcelery.setup_loader()
BROKER_URL= 'amqp://guest@localhost//'
CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'celery_app',
'djcelery',
'kombu.transport.django',
)
然後我們配置任務的資訊,在django-celery專案目錄下,建立檔案celery.py
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', 'django_celery.settings')
app = Celery('django_celery')
# 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))
在應用celery_app的目錄下,建立任務tasks.py,我們定義了幾個方法供呼叫。
from __future__ import absolute_import
from celery import shared_task
import time
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
time.sleep(10)
return x * y
@shared_task
def xsum(numbers):
time.sleep(10)
return sum(numbers)
基礎配置完成後,我們來試用一下。
然後配置DB的資訊,使用命令
python manage.py syncdb
這個過程會提示你建立一個超級使用者,照做就可以了。
啟動服務
python manage.py runserver
然後開啟另外一個視窗,啟動celery的服務
python manage.py celery worker -l info
這個過程很可能會跑出警告:
root@localhost django_celery]# python manage.py celery worker -l info
Running a worker with superuser privileges when the
worker accepts messages serialized with pickle is a very bad idea!
If you really want to continue then you have to set the C_FORCE_ROOT
environment variable (but please think about this before you do).
User information: uid=0 euid=0 gid=0 egid=0
其實這個意思很明確,如果確認需要,要設定變數C_FORCE_ROOT,風格和sandbox很類似。
export C_FORCE_ROOT=test
>python manage.py celery worker -l info
可以從啟動日誌看到task的資訊:
[tasks]
. celery_app.tasks.add
. celery_app.tasks.mul
. celery_app.tasks.xsum
. django_celery.celery.debug_task
再次開啟一個新的會話,這算是會話3,我們開啟shell互動視窗。
>>> from celery_app.tasks import *
>>> dir()
['__builtins__', 'absolute_import', 'add', 'mul', 'shared_task', 'xsum']
>>> mul(5,2)
10
這個時候如果使用delay,add的方式,就會進入訊息佇列。
>>> mul.delay(5,2)
<AsyncResult: 7d647a77-8344-4813-bc15-791ed1a8c3d3>
>>>
>>> add.delay(2,3)
<AsyncResult: 0408ed38-7537-458f-87de-8cae058123e2>
>>>
檢視worker的日誌資訊如下:
[2018-01-08 14:34:47,505: INFO/MainProcess] Received task: celery_app.tasks.add[bac53d49-24cf-4d07-8515-8eff8083cab9]
[2018-01-08 14:34:47,507: INFO/MainProcess] Task celery_app.tasks.add[bac53d49-24cf-4d07-8515-8eff8083cab9] succeeded in 0.0008037839998s: 6
使用RabbitMQ的日誌是類似的。
如果要啟用flower介面,也是分分鐘搞定。
安裝flower:
pip install flower
啟動服務
python manage.py celery flower
訪問埠:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2152362/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Django(1) - 初識Django框架Django框架
- 初識Django(一)Django
- django中使用celeryDjango
- 在django中使用celeryDjango
- Django 進階之 celeryDjango
- [Django青銅修煉手冊] 初識DjangoDjango
- django初識(以django4.2.11為例)Django
- Django專案中使用CeleryDjango
- django_celery_beat的部署Django
- 初識python web框架-- DjangoPythonWeb框架Django
- python django與celery的整合PythonDjango
- celery 在django專案中使用Django
- django + redis + celery 非同步任務DjangoRedis非同步
- 在django中使用celery(而不是djcelery)Django
- Django+Celery非同步傳送郵件Django非同步
- celery4+django2定時任務Django
- Django 使用 Celery 實現非同步任務Django非同步
- Django(41)詳解非同步任務框架CeleryDjango非同步框架
- 在 Django 中使用 Celery 來進行耗時操作Django
- 【Python】django-celery非同步任務佇列PythonDjango非同步佇列
- Celery非同步排程框架(二)與Django結合使用非同步框架Django
- 快取更新-- 穿透/擊穿/雪崩 django-celery-flower Celery的應用///如何不重啟寫入快取穿透Django
- 基於Django與Celery實現非同步佇列任務Django非同步佇列
- Django常識Django
- Django配置celery執行非同步任務和定時任務Django非同步
- Django 如何使用 Celery 完成非同步任務或定時任務Django非同步
- 求助!!!!Django+Celery非同步執行神經網路時出錯Django非同步神經網路
- Django+Hybrid 初體驗Django
- Django web開發 初實現DjangoWeb
- 初識MybatisMyBatis
- 初識 DockerDocker
- rocketmq初識MQ
- 初識 reduxRedux
- 初識GitGit
- Express初識Express
- Kafka 初識Kafka
- 初識 “HTML”HTML
- 初識GolangGolang