異步任務(wù)
1:環(huán)境準(zhǔn)備
安裝celery荣挨,rabbitmq-server,django-celery.
pip install celery
pip install-django-celery
apt-get install rabbitmq-server
2:啟動(dòng)消息中間件rabbitmq
因?yàn)楣俜酵扑]用它草雕,也可以用redis拭荤,也可以用Django。但是redis會(huì)因?yàn)閿嚯姷脑蛟斐蓴?shù)據(jù)全部丟失等問題议慰。用Django顯得比較業(yè)余仇轻。
讓其在后臺(tái)運(yùn)行
sudo rabbitmq-server -detached
3:Django代碼相關(guān)
目錄結(jié)構(gòu)如下
1): settings.py文件
import djcelery
djcelery.setup_loader()
BROKER_URL="amqp://"
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 task
@task(name="task1") ? ? ? ?#name參數(shù)穿不穿都行
#@task
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. 啟動(dòng)worker ==> python manage.py celery worker --loglevel=info -c 20
6. 啟動(dòng)django ==> python manager.py runserver
-c表示可最多處理20個(gè)任務(wù)
定時(shí)任務(wù)
如果定時(shí)任務(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ù)值
? ? }
}
注意:啟動(dòng)celery時(shí)需要加上beat參數(shù)挤牛。
python manage.py celery worker -c 20 -loglevel=info --beat
或者
python manage.py celery worker -c 20 -l info --beat
-c表示可最多處理20個(gè)任務(wù)