django+celery+redis实现异步任务

1、环境搭建

  (1)celery: pip install celery
  (2)django: pip install django
  (3)redis: 在官方网站(http://redis.io/download)下载对应版本进行安装
    a、启动验证redis是否配置成功:redis-server redis.conf;
    b、验证redis是否启动成功:redis-cli ping;出现pong则表示启动成功;
    c、情况缓存:redis-cli flushdb;

2、django配置redis和celery

  (1) settings.py

  # CELERY STUFF
  BROKER_URL = 'redis://localhost:6379'
  CELERY_RESULT_BACKEND = 'redis://localhost:6379'
  CELERY_ACCEPT_CONTENT = ['application/json']
  CELERY_TASK_SERIALIZER = 'json'
  CELERY_RESULT_SERIALIZER = 'json'
  CELERY_TIMEZONE = 'Africa/Nairobi'

  (2) 新增celery.py文件(与settings.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', 'test_celery.settings')
  app = Celery('test_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))

  (3) __init__.py(与settings.py同级目录)

  from __future__ import absolute_import
  from .celery import app as celery_app

  (4)新建一个app(如:test_app),在test_app目录下新增tasks.py文件

  from celery.decorators import task
  from celery import shared_task

  @task(name="test_task")
  def test_task():
      return 'this is test!'

  @shared_task
  def test(param):
      return 'The test task executed with argument "%s" ' % param

  (5) 目录结构类似于下面

  /test_django
  ├── test_django
  │   ├── celery.py       # add
  │   ├── __init__.py     # modified
  │   ├── settings.py     # modified
  │   ├── urls.py
  │   └── wsgi.py
  ├── manage.py
  └── test_app
      ├── __init__.py
      ├── models.py
      ├── tasks.py        # add
      ├── tests.py
      └── views.py

3、测试配置是否成功

终端执行:celery --app=test_app.celery:app worker --loglevel=INFO

 -------------- celery@USER-3A2H68D84A v3.1.23 (Cipater)
---- **** -----
--- * ***  * -- Windows-7-6.1.7601-SP1
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         spider:0x35a2278
- ** ---------- .> transport:   redis://localhost:6379//
- ** ---------- .> results:     redis://localhost:6379/
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery
(出现下面输出则表示配置成功)
[tasks] . test_app.tasks.test . test_app.tasks.test_task
...

4、执行django程序,测试

(1)配置urls.py
  如:url(r'^$', home, name='home')
(2)设置views.py视图
  def home(request):
    test_task.delay()
      return render(request, 'home.html', locals())
 (3)出现下列结果则表面配置成功
[
2016-05-12 16:24:56,109: INFO/MainProcess] Received task: test_task[84ac94c4-c35d-49cb-b643-513a2b507f1c] [2016-05-12 16:24:56,200: INFO/MainProcess] Task test_task[84ac94c4-c35d-49cb-b643-513a2b507f1c] succeeded in 0.0940000000409782s: this is test!

posted on 2016-05-12 16:36  JFluo  阅读(536)  评论(3)    收藏  举报

导航