django集成celery

Celery是一個基於分佈式消息傳遞的開源異步任務隊列,在django實際應用場景下,每每有一些較爲耗時,但並不須要返回值的任務,python

例如發送郵件,更新咱們本身的統計數據庫,這時咱們能夠將這些任務交由celery管理,以加快網頁返回。git

本文重點來說解django+redis+celery的配置,爲何這麼配置自行google,例如absolute_import的用處等,另外也可查看官方給出的django-celery配置實例github

django項目佈局以下:redis

  proj              
    ├── proj             
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py          
    │   └── wsgi.py        
    └── manage.py 

1.  新建proj/proj/celery.py文件數據庫

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', 'proj.settings')

app = Celery('proj')

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

  

2.  在proj/proj/__init__.py 模塊中導入這個 Celery 實例,以確保當 Django 啓動時能夠加載這個 appdjango

而且 @shared_task 裝飾器也能使用。json

from .celery import app as celery_app

__all__ = ['celery_app']

  

3. settings.py配置centos

# celery settings
# Broker
BROKER_URL = 'redis://127.0.0.1:6379/1'
# Result
# CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'

CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

  

4. 在各app下建立tasks.py文件,注意此處只能以tasks命名app

 

from celery import shared_task


@shared_task
def add(x, y):
    return x + y

# pv uv 統計案例
from django.db.models import F # 獲取源數據

from .models import Post

@app.task
def increase_pv(post_id):
    return Post.objects.filter(id=post_id).update(pv=F('pv')+1)

  

5. views.py中引入便可異步

from .tasks import add


add.delay(*args)  

6. 啓動Worker

在django項目根路徑下,鍵入

$ celery worker -A proj -l info

 

-------------------------------------

bug 記錄,真實環境centos部署沒有問題。

環境 win10,celery==4.3.0,redis==3.2.1(celery版本要求redis>3.2.0)

啓動worker成功,但執行異步任務失敗

報ValueError: not enough values to unpack (expected 3, got 0)

解決方式

$ pip install eventlet

$celery worker -A proj -l info -P eventlet
相關文章
相關標籤/搜索