首页 技术 正文
技术 2022年11月8日
0 收藏 490 点赞 1,399 浏览 3744 个字

已经安装环境:

Python3.6

django==2.1.8(用2.2.2需要升级sqlite3)

项目名称:ceshiproject   APP名称:ceshi

第一步:centos7下首先安装redis程序

wget http://download.redis.io/releases/redis-5.0.5.tar.gz 或者 到官网https://redis.io/download 查看教程并下载
tar xzf redis-5.0.5.tar.gz
yum install gcc gcc-c++ #安装一下依赖,如果有省略
cd redis-5.0.5
make MALLOC=libc
cd src && make install
---------到此安装完成---------------
cd redis-5.0.5 #进入安装目录
./redis-server #启动redis
./redis-cli #可进入redis命令模式,一般用不上

第二步:安装django-celery==3.2.2,并在APP中添加加 ‘djcelery’ (注意:如果超过3.2.2版本程序会报错:TypeError: can only concatenate list (not “tuple”) to list)

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ceshi',
'djcelery'
]

第三步:在项目ceshiproject下,新建配置文件celeryconfig.py,内容如下

# -*- coding:utf-8 -*-
import djcelery
djcelery.setup_loader()
from datetime import timedelta#设置任务运行时,使用的队列,以防造成定时,跟定期拥堵
CELERY_QUEUES = {
'beat_task1':{
'exchange':'beat_task1',
'exchange_type':'direct',
'binding_key':'beat_task1'
},
'work_queue':{
'exchange':'work_queue',
'exchange_type':'direct',
'binding_key':'work_queue'
}
}#设置默认使用的队列
CELERY_DEFAULT_QUEUE = 'work_queue'#导入任务
CELERY_IMPORTS=(
'ceshi.task1',
)#有些情况下防止死锁
CELERY_FORCE_EXECV = True#设置并发的worker数量,根据cpu核心数量来定
CELERY_CONCURRENCY = 4#任务失败,可以允许重试
CELERY_ACKS_LATE = True#设置每一个worker可以执行多少个任务后销毁,防止内存泄漏
CELERY_MAX_TASKS_PER_CHILD = 100#单个任务最大的运行时间,这边设置6分钟
CELERY_TASK_TIME_LIMIT = 12 * 30# 定时任务
CELERYBEAT_SCHEDULE = {
'task1': {
'task': 'ceshi_task', # 任务名称
'schedule': timedelta(seconds=10), # 时间周期
'options': {
'queue': 'beat_task1' # 消息队列
}
},
# 'task2': {
# 'task': 'update-db', # 任务名称
# # 'schedule': crontab(minute=0, hour=0), # 每天凌晨执行一次
# 'schedule': timedelta(seconds=10), #
# 'options': {
# 'queue': 'beat_tasks'
# }
# }
}

第四步:在APP下面新建任务task1.py,内容如下:

from celery.task import Task  #调用celery中的task模块
import time
class ceshitask(Task):
name = "ceshi_task"
def run(self, *args, **kwargs):
print ("start ceshi task")
time.sleep(5)
print ("args={},kwargs={}".format(args,kwargs))
print ("end task")

第五步:配置好项目跟APP的路由

项目ceshiproject路由:

from django.contrib import admin
from django.urls import path,includeurlpatterns = [
path('admin/', admin.site.urls),
path('', include('ceshi.urls',namespace='ceshi')),
]

APP(ceshi)的路由

from django.urls import path
from . import views
app_name="ceshi"
urlpatterns = [
path('do/', views.do,name='do'),
]

第六步:

首先安装redis驱动:pip install redis==2.10.6

redis==2.10.6 (高版本会报错,用于django内部驱动用跟下面安装程序是不一样)

在setting.py中配置redis调用,引入项目下面的celerycofig.py

from .celeryconfig import *
BROKER_BACKEND = 'redis'
BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'

第七步:在views.py中引入APP下面的task1,并调用

from django.http import JsonResponse
from ceshi.task1 import ceshitaskdef do(request):
#执行异步任务
print ('start request')
ceshitask.delay()
print ('end request')
return JsonResponse({"result":"ok"})

第八步:开启两个终端,并在终端中(Terminal)启动celery中的worker跟定时任务beat模块,进行测试

python manage.py celery worker -l INFO   #首先开启worker
python manage.py celerybeat -l INFO #开启定时任务

第九步:上面可以使用了,如果要在django中调用,进行一序列的操作,请继续往下走:

1.把django中cache用于redis

首先安装django-redis==4.10

2.把下面的内容添加到django的settings.py中(redis默认不能超过16,如果

redis://127.0.0.1:6379/10 设置为17会出现:redis.exceptions.ResponseError: DB index is out of range

CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 把这里缓存你的redis服务器ip和port
"LOCATION": "redis://127.0.0.1:6379/10",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}# 3.设置redis存储django的session信息
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

3.可以在task任务,通过下面命令设置redis,(注意:设置cache时候参数加None,即cache永久不失效)

from django.core.cache import cache
class ceshitask(Task):
name = "ceshi_task"
def run(self, *args, **kwargs):
cache.set("start-ceshi-task",值, None)
return "ceshi....."

4.在views中调用

from django.shortcuts import render,HttpResponse
from django.core.cache import cache
import jsondef num_recode(request):
count = cache.get("start-ceshi-task")
print(json.loads(count))
return HttpResponse(count)
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,087
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,562
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,821
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905