django使用celery實現異步操作

需求:

    django支持的http請求都是同步的,對於需要耗時較長的操作可能會導致阻塞。爲此我們需要引入異步處理機制,即收到客戶端請求後立即給予響應,具體任務交給另一個進程處理。

使用方法:

       1. 安裝軟件

           pip install celery

           pip install django-celery

        2. 在django項目(設爲djprj)添加以下文件:

            1) djprj/djprj/celery.py,內容如下:

from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE','djprj.settings')

from django.conf import settings

app = Celery('djprj', backend='redis', broker='redis://127.0.0.1:6379/0')

# 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)

    2) 修改djprj/djprj/__init__.py文件,加入以下內容:

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

    3) 在djprj項目中需要異步處理的app中加入tasks.py文件。

    內容如下:

# -*- coding: utf-8 -*-
# 本模塊定義了celery任務
from __future__ import absolute_import
import logging
from celery import shared_task

@shared_task
def add(x, y):
    log = logging.getLogger(config.HC_ASVR_LOG_NAME_TRACK)
    log.debug("Enter celery task tk2.tasks.add()")
    return x + y

    4) 嘗試啓動celery

    celery -A djprj worker --loglevel=info --workdir=/path/to/djprj --logfile=/path/to/logfile

    如果執行成功,則將其加入到supervisord配置文件,運行於守護進程模式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章