Windows+ Django + celery +redis
简介我就不多说,你随便搜一搜那哪都是。
中文手册地址:https://www.celerycn.io/ru-men/celery-jin-jie-shi-yong
官网地址:https://docs.celeryproject.org/en/stable/
pip install 以下库。这一套库亲测有效你可以直接按这个版本
celery 3.1.26.post2
Django 3.2
django-celery 3.3.0
django-redis 4.12.1
multivolumefile 0.2.3
numpy 1.19.5
pip 21.1.1
PyMySQL 1.0.2
redis 3.2.0
官方说celery-4.0以后就不再支持windows。所以你在windows下开发一定要看清版本,否则会报各种错【躺了很多坑,血一样的教训】。
我的Djang下目录结构如下:
1、init.py[修改]
from __future__ import absolute_import, unicode_literals
import pymysql
pymysql.install_as_MySQLdb()
\# 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
__all__ = ['celery_app']
2、settings.py[修改]
其他代码不表,修改INSTALLED_APPS和新增redis配置
#【新增ridis配置】设置缓存时间
REDIS_TIMEOUT=24*60*60
CUBES_REDIS_TIMEOUT=60*30
NEVER_REDIS_TIMEOUT=365*24*60*60
CACHES={'default':{
'BACKEND':'django_redis.cache.RedisCache',
'LOCATION':'redis://localhost:6379',#redis所在服务器或容器ip地址
"OPTIONS":{
"CLIENT_CLASS":"django_redis.client.DefaultClient",
"PASSWORD":"",#你设置的密码
},}}
3、celery.py [新增]
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:lf
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings') # 设置django环境
# app = Celery('pro')
app = Celery('项目名', backend='redis://localhost:6379/1', broker='redis://localhost:6379/0')
app.config_from_object('django.conf:settings')
app.conf.broker_url = 'redis://localhost:6379/0'
app.conf.broker_transport_options = {'visibility_timeout': 43200}
app.conf.timezone = 'Asia/Shanghai'
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
platforms.C_FORCE_ROOT = True
from kombu import serialization
serialization.registry._decoders.pop("application/x-python-serialize")
app.conf.update(
CELERY_ACCEPT_CONTENT = ['json'],
CELERY_TASK_SERIALIZER = 'json',
CELERY_RESULT_SERIALIZER = 'json',
)
if __name__ == '__main__':
app.start()
pass
4、tasks.py[新增]
From __future__ import absolute_import,unicode_literals
From celery import shared_task
@shared_task
Def add(a,b):
print(a+b)
pass
5、views.py[修改]
from objname import tasks
def creste_tasks():
res = tasks.add.delay(1,3)#注意要加.delay()
return
输入命令启动:
python manage.py runserver
#windows下输入以下服务开启
Celery -A Newsletter.celery worker -l info --pool=solo --scheduler django_celery_beat.schedulers:DatabaseSched
uler
#linux
celery -A 项目名.celery worker -l info --pool=solo --scheduler django_celery_beat.schedulers:DatabaseScheduler
开启后如图成功:
常见错误:
[2021-05-14 10:37:26,083: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379/0: .
Trying again in 2.00 seconds...
[2021-05-14 10:37:32,179: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379/0: .
Trying again in 4.00 seconds...
这种你未开启redis数据库服务,开启就好