Django+Celery+Redis 使用
2020-06-22 本文已影响0人
朱佩奇被占用
pip install django==2.1.4
pip install redis==3.2.0
pip install celery==4.4.2
pip install eventlet # celery 4.0+版本以后不支持在windows运行,还需额外安装eventlet库
settings.py配置
CELERY_BROKER_URL = 'redis://localhost'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'redis://localhost'
CELERY_TASK_SERIALIZER = 'json'
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379", # 这里设定了本机的redis数据
# "LOCATION": "redis://:passwordpassword@47.193.146.xxx:6379/0", # 如果redis设置密码的话,需要以这种格式host前面是密码
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
在同级目录下还需要添加celery.py文件
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# 指定Django默认配置文件模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'linfen.settings')
# 为我们的项目myproject创建一个Celery实例。这里不指定broker容易出现错误。
app = Celery('linfen', broker='redis://127.0.0.1:6379/0')
# 这里指定从django的settings.py里读取celery配置
app.config_from_object('django.conf:settings')
# 自动从所有已注册的django app中加载任务
app.autodiscover_tasks()
# 用于测试的异步任务
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
在settings.py 同级的init.py 写入下面内容 确保项目启动时即加载Celery实例:
from __future__ import absolute_import, unicode_literals
# 引入celery实例对象
from .celery import app as celery_app
__all__ = ('celery_app',)
在模块中添加tasks.py
from celery import Celery, shared_task
@shared_task(bind=True)
def insert_search_result(self, search):
if search:
search_id = search['search_id']
cday = search['cday']
json_search = search['json_search']
td_len = search['td_len']
sr = SearchResult()
sr.search_id = search_id
sr.createtime = cday
sr.req = json_search
sr.result_size = td_len
sr.save()
return True
else:
return False
最后可在其他文件中调用此任务函数,以达到异步:
isr = tasks.insert_search_result.delay(search_dic)
启动redis 和django 然后打开terminal 输入如下内容 启动worker:
# Linux下测试
Celery -A myproject worker -l info
# Windows下测试
Celery -A myproject worker -l info -P eventlet