我在这把我的配置全过程都记录下,具体到每一个步骤
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
之后将 celery注册到appimport djcelery
然后是celery的基本配置INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'apps.index', 'djcelery', ]
注意这里,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的配置如下:
之后将 celery注册到appimport celery
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
至此,配置完成。