異步任務(wù)
1:環(huán)境準(zhǔn)備
安裝celery,rabbitmq-server,django-celery.
pip install celery
pip install-django-celery
apt-get install rabbitmq-server
2:啟動消息中間件rabbitmq
因為官方推薦用它,也可以用redis了罪,也可以用Django娃圆。但是redis會因為斷電的原因造成數(shù)據(jù)全部丟失等問題臀稚。用Django顯得比較業(yè)余。
讓其在后臺運行
sudo rabbitmq-server -detached
3:Django代碼相關(guān)
目錄結(jié)構(gòu)如下
1): settings.py文件
import djcelery
djcelery.setup_loader()
INSTALLED_APPS = [
? ? ............
? ? 'celerytest',
? ? 'djcelery',
? ? 'kombu.transport.django',
]
2):?urls.py文件
from celerytest import views
urlpatterns = [
? ? url(r"^index", views.IndexView.as_view(), name="index"),
]
3):?tasks.py文件
import time
from celery import Celery
app = Celery('task', broker='amqp://', backend="amqp://")
@app.task(name="task1") ? ?#name參數(shù)必須傳
def celery_test(args):
? ? print 2222222222
? ? print args
? ? filename = time.strftime("test.txt")
? ? with open(filename, "w") as f:
? ? ? ? f.write("Hello World!")
? ? time.sleep(2)
? ? print 333333333333333333
4):?views.py文件
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.http import HttpResponse
from django.views.generic import View
from tasks import celery_test
class IndexView(View):
? ? def get(self, request):
? ? ? ? print 11111111111111
? ? ? ? celery_test.delay("test")?# delay中傳入任務(wù)的參數(shù)
? ? ? ? return HttpResponse("OK")
4."重要" ==>??python manage.py makemigrations
python manage.py migrate ?"遷移"
5. 啟動worker ==>進(jìn)入到tasks.py文件所在目錄, 執(zhí)行 celery -A tasks worker --loglevel=info -c 20
6. 啟動django ==> python manager.py runserver
-c表示可最多處理20個任務(wù)
定時任務(wù)
如果定時任務(wù)的話茧泪,在上面的基礎(chǔ)上還需要再加上以下代碼
如果install_apps中加入了djcelery后代嗤,還沒有同步數(shù)據(jù)庫的話,
還需要執(zhí)行 ?python manage.py migrations 和 python manage.py migrate 來同步數(shù)據(jù)庫柴罐;
settings.py文件中添加
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
from celery.schedulesimport crontab
from datetimeimport timedelta
CELERYBEAT_SCHEDULE = {
? ? 'timing': {
? ? ? ? 'task':'database.tasks.celery_test',
? ? ? ? #'schedule': crontab(minute=u'15', hour=u'14',), ? ?# 每天的14:15分執(zhí)行任務(wù)
? ? ? ? 'schedule': timedelta(seconds=10), ? # 每隔10秒鐘調(diào)用一次
? ? ? ? 'args': ("test",) ? #這里是被調(diào)用函數(shù)傳入的參數(shù)值
? ? }
}
注意:啟動celery時需要加上beat參數(shù)详炬。
python manage.py celery worker -c 20 -loglevel=info --beat
或者
python manage.py celery worker -l info -c 20 --beat
-c表示可最多處理20個任務(wù)