django-celery 异步任务和定时任务

异步任务


1:环境准备

安装celery,rabbitmq-server,django-celery.

pip install celery

pip install-django-celery

apt-get install rabbitmq-server

2:启动消息中间件rabbitmq

因为官方推荐用它,也可以用redis,也可以用Django。但是redis会因为断电的原因造成数据全部丢失等问题。用Django显得比较业余。

让其在后台运行

sudo rabbitmq-server -detached

3:Django代码相关

目录结构如下


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参数必须传

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中传入任务的参数

        return HttpResponse("OK")

4."重要" ==>  python manage.py makemigrations

python manage.py migrate  "迁移"

5. 启动worker ==>进入到tasks.py文件所在目录, 执行 celery -A tasks worker --loglevel=info -c 20

6. 启动django ==> python manager.py runserver


-c表示可最多处理20个任务


定时任务

如果定时任务的话,在上面的基础上还需要再加上以下代码


如果install_apps中加入了djcelery后,还没有同步数据库的话,

还需要执行  python manage.py migrations 和 python manage.py migrate 来同步数据库;


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分执行任务

        'schedule': timedelta(seconds=10),   # 每隔10秒钟调用一次

        'args': ("test",)   #这里是被调用函数传入的参数值

    }

}


注意:启动celery时需要加上beat参数。

python manage.py celery worker -c 20 -loglevel=info --beat

或者

python manage.py celery worker -l info -c 20 --beat


-c表示可最多处理20个任务

你可能感兴趣的:(django-celery 异步任务和定时任务)