Celery+redis實現異步

Celery+redis實現異步

[TOC]python

安裝redis

sudo apt-get install redis-serverredis

安裝celery-with-redis

進入虛擬環境django

source bin/activejson

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

相關文章
相關標籤/搜索