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!
浙公网安备 33010602011771号