这可能是全网最细的Django异步任务 Celery+Redis 的配置教程了

我在这把我的配置全过程都记录下,具体到每一个步骤

Window

    简单的说下windows。windows下能正常运行celery的版本最高只到 3.1.26.post2。再高的话,对不起,就不兼容了 - -!, 还有一个致命的问题,就是celery中有某个文件用到了 async 这个关键字。而这个关键字在 python3.6以后就成为了python的关键字了,就会产生冲突。这个问题celery在 4.4.1版本之后就已经修复。但是,window他不支持这个版本啊。 = = 。 是不是很无语…

1. 当你的python版本为3.6或以下

首先安装 django-celery
你在安装django-celery的时候会自动的帮你安装celery 3.1.26.post2

pip install django-celery

在Django应用的settings同级目录下 建立 celery.py 文件 ,内容写入以下
在这里插入图片描述

注意: 把 djangoProject 改为你的 django 应用名称。 (说白就是你settings同级的目录名称)

import os
from celery import Celery
from django.conf import settings

# 指定 clelery 默认的 settings 目录  注意将 djangoProject 改为你自己的应用名称
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject.settings')

# 实例化 celery   这里也是 注意将 djangoProject 改为你自己的应用名称
app = Celery('djangoProject')  

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings')

# 加载所有 settings下的app中包含的 tasks
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

在settings 同级的目录下的 _init_.py 中写入以下- 在这里插入图片描述

复制就好了,不用改

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']

在你的app中创建 tasks.py 文件 (注意是 tasks 不是 task ,我最早就是少写了s 头疼了很久)
在这里插入图片描述
创建好之后就可以在这里写下你的异步任务了。这里举个例子,写了一个 add()的异步任务,为了体现出来他是异步的我们让他sleep 10秒

from djangoProject.celery import app
import time

@app.task # 看清楚啊,这里是 task 不是 tasks
def add(a, b):
    time.sleep(10)
    return a * b

  • 最后是在settings中进行对 celery的配置
    首先导入 django-celery
    import djcelery
    
    之后将 celery注册到app
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'apps.index',
        'djcelery',
    ]
    
    然后是celery的基本配置
    注意这里,broker的url为你自己的 redis地址
    # celery 配置
    djcelery.setup_loader()
    BROKER_URL = 'redis://192.168.1.220:6379/'  # 注意换成你自己的redis
    CELERY_TIMEZONE = TIME_ZONE    # 这里使用Django默认的时区。
    CELERYD_CONCURRENCY = 1  # 并发的work数量
    CELERYD_FORCE_EXECV = True  # 防止死锁
    CELERYD_PREFETCH_MULTIPLIER = 3  # worker 每次去redis取任务的数量
    CELERYD_MAX_TASKS_PER_CHILD = 200  # 每个worker最多执行完200个任务就会被销毁,可防止内存泄露
    

到这里,celery的配置就已经完成了。我们在views中简单的测试下

from django.shortcuts import render
from django.http import HttpResponse
from .tasks import add

# Create your views here.

def index(request):
    add(5, 6)
    return HttpResponse('123')

我们先启动celery 。 启动命令如下,当你看到这个界面说明你已经启动成功了。

python manage.py celery worker -l info

在这里插入图片描述

我们启动服务,访问 我们的地址
在这里插入图片描述
可以看到,他在转圈,说明确实是调用了add方法,而add方法中的time.sleep(10) 让他sleep了 10秒 所以现在在加载。但是! 我们需要的不是异步吗?? 明明是异步任务。为什么这里还在加载呢?= = 不要慌,往下看!

要是想让他异步,只需要在对应的方法上加上.delay() 就好了,当然也可以不加.delay() 不加的话这个方法就不是异步的了,而是直接调用。这里我们加上 delay()。

def index(request):
    add.delay(5, 6)
    return HttpResponse('123')

再访问,发现已经ok了。页面瞬间加载了出来。
在这里插入图片描述
可以看到 celery接收到了 一个 add 的异步任务
在这里插入图片描述
10秒之后celery显示出了 return的结果。
在这里插入图片描述 至此异步任务就完成了。

2. 当你的python版本为3.6以上

这里可能会有朋友问了,难道我们在windows上用python3.7,3.8的就不能用celery了吗?如果你的py版本是3.7,我非常抱歉地告诉你,celery是真的没有兼容3.7(已经踩过3.7的深坑,请降为3.6或者升到3.8,这里我更推荐3.8。因为3.8可以说是目前最稳定的一个py版本了)。如果你的py是3.8或以上,那么恭喜你,是可以正常使用celery的。

  • 首先安装 celery 4.4.7 版本. 注意:当你的python 版本为3.7或以上,就不需要再安装django-celery了。因为4.X版本的celery已经完全的兼容了django-celery了。所以在这里只需要安装celery 4.4.7就好了.
pip install celery==4.4.7
  • 这里可能会有人疑惑。不是说windows在celery 3.1.26.post2的之后版本已经不兼容了吗? 为什么我们这里还要装4.4.7?
    windows 确实是不兼容,但是,我们找个办法让他兼容不就好了吗 ?
    安装 eventlet 模块
pip install eventlet
  • 在settings 同级的目录下的celery.py 其中的代码以及 init.py 中写入的代码同以上 python3.6。这里就不再写了,童鞋请往上翻。

  • 在 settings 中的配置 需要注意。我们在 settings 中不再用 djcelery 了。而是直接使用celery 。配置如下:
    首先导入 celery。注意是 celery哦,不是djcelery了。

    import celery
    

    之后将 celery注册到app

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'apps.index',
        'celery',
    ]
    

    然后是celery的基本配置
    注意这里,broker的url为你自己的 redis地址

    # celery 配置
    # djcelery.setup_loader()  # 注意: 这一句话已经不需要了。
    BROKER_URL = 'redis://192.168.1.220:6379/'  # 注意换成你自己的redis
    CELERY_TIMEZONE = TIME_ZONE    # 这里使用Django默认的时区。
    CELERYD_CONCURRENCY = 1  # 并发的work数量
    CELERYD_FORCE_EXECV = True  # 防止死锁
    CELERYD_PREFETCH_MULTIPLIER = 3  # worker 每次去redis取任务的数量
    CELERYD_MAX_TASKS_PER_CHILD = 200  # 每个worker最多执行完200个任务就会被销毁,可防止内存泄露
    
  • 启动命令也要注意了,当你使用 celery 4.4.7版本的话,启动命令为:

celery -A djangoProject worker -l info -P eventlet

在这里简单说下这个命令的意思。 -A 代表指定你要启动的celery对应的 app的名字,也就是你在celery.py中app = Celery('djangoProject')的这一行代码中所设置的名字。-l info 代表终端将会把celery的运行详情信息打印出来。 而-P eventlet 代表着用到 eventlet 模块来使 celery 4.4.7 版本来兼容 windows。

Ubuntu

当你的开发环境为 Linux 的时候,就完全没有windows的烦恼了,直接安装 celery 4.4.7 就好了。不需要eventlet 模块。

pip install celery==4.4.7

所有的配置和 window 下 python3.6以上版本的一样。

  • 在settings 同级的目录下的celery.py 其中的代码以及 init.py 中写入的代码同以上 。这里就不再写了,童鞋请往上翻。 settings的配置如下:
    import celery
    
    之后将 celery注册到app
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'apps.index',
        'celery',
    ]
    
    # celery 配置
    # djcelery.setup_loader()  # 注意: 这一句话已经不需要了。
    BROKER_URL = 'redis://192.168.1.220:6379/'  # 注意换成你自己的redis
    CELERY_TIMEZONE = TIME_ZONE    # 这里使用Django默认的时区。
    CELERYD_CONCURRENCY = 1  # 并发的work数量
    CELERYD_FORCE_EXECV = True  # 防止死锁
    CELERYD_PREFETCH_MULTIPLIER = 3  # worker 每次去redis取任务的数量
    CELERYD_MAX_TASKS_PER_CHILD = 200  # 每个worker最多执行完200个任务就会被销毁,可防止内存泄露
    

启动命令为:

celery -A djangoProject worker -l info 

至此,配置完成。


  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值