Celery+redis實現異步
[TOC]python
安裝redis
sudo apt-get install redis-server
redis
安裝celery-with-redis
進入虛擬環境django
source bin/active
json
pip 安裝app
pip install celery-with-redis
異步
這一步會安裝幾個包 具體每一個有什麼用我也不知道 反正好用就行ui
添加celery相關配置
在項目配置目錄下(即 settings.py 所在目錄)添加 celery.py 文件url
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import absolute_import import os from celery import Celery from django.conf import settings # set the default Django settings module for the program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings') app = Celery('project_name') # 這裏project_name填寫項目名稱, 注意不是app名稱 # 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))
這樣還不夠, 還須要讓python可以啓動celery, 因此修改項目配置目錄下(即 settings.py 所在目錄)的 __init__.py 文件, 在其中添加spa
from .celery import app as celery_app
同時, 還需在 settings.py 中添加debug
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 = TIME_ZONE # 使用settings.py中的時區
由於redis默認開的端口是6379, 沒有更改配置的話就是這樣配置
建立異步運行任務tasks.py
在app目錄下建立tasks.py以下
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals import time from celery import Celery from django.core.mail import send_mail, EmailMultiAlternatives, BadHeaderError from .models import common_member, common_member_email_send_time celery = Celery('tasks', broker='redis://localhost:6379/0') @celery.task def add(x, y): return x + y @celery.task def run_test_suit(ts_id): print("++++++++++++++++++++++++++++++++++++") print('jobs[ts_id=%s] running....' % ts_id) time.sleep(10.0) print('jobs[ts_id=%s] done' % ts_id) result = True return result # @celery.task # def send_email_1(msg): # msg.send()
這個地方我又按照廖雪峯的教程從新配置了celery, 可能有重複配置, 可是能用.
在 views.py 中添加相關視圖
from django.http import HttpResponse from .tasks import run_test_suit def tasks(request): print('before run_test_suit') result = run_test_suit.delay('110') print('after run_test_suit') return HttpResponse("job is runing background~")
注意用了delay方法, 這個方法是放在裝飾器裏面的.
添加urls.py
略
啓動
-
啓動redis
redis-server
-
啓動celery
celery -A project_name worker -l info
啓動celery後, 在終端能夠看到celery的log信息, 對於debug頗有幫助
-
啓動django
python manage.py runserver