环境:
Ubuntu 19.10
python 3.6
django 2.1
django-rq 2.2
安装django-rq
pip install django-rq
使用方式
配置settings
# django-rq配置,setting中的配置
RQ_QUEUES = {
'default': {
'HOST': 'localhost', # redis地址
'PORT': 6379, # redis端括号
'DB': 10, # 使用的是哪个redis db
'PASSWORD': '123456', #redis 密码
'DEFAULT_TIMEOUT': 360, # 此队列中任务的超时时间
},
'with-sentinel': {
'SENTINELS': [('localhost', 26736), ('localhost', 26737)],
'MASTER_NAME': 'redismaster',
'DB': 10,
'PASSWORD': '123456',
'SOCKET_TIMEOUT': None,
'CONNECTION_KWARGS': {
'socket_connect_timeout': 0.3
},
},
'high': {
'HOST': 'localhost',
'PORT': 6379,
'DB': 10,
'DEFAULT_TIMEOUT': 500,
},
'low': {
'HOST': 'localhost',
'PORT': 6379,
'DB': 10,
}
}RQ_EXCEPTION_HANDLERS= [] # 定义自定义异常处理函数
配置路由
#路由配置,可以在此路由查看队列的相关信息
urlpatterns = [
path('django-rq/', include('django_rq.urls'))
]
配置app
INSTALLED_APPS = (
# other apps
"django_rq",
)
创建视图
我这里创建一个异步任务需要两个接口,一个接口把需要处理的异步任务放入队列中(瞬间完成不需要用户等待),另一个接口则根据这个任务的id找到该任务,然后进行状态访问
from django.views import View
import django_rq
import rq
from django.http import JsonResponse
#状态访问
class LabelFile(View):
def get(self, request):
queue = django_rq.get_queue('low') #获取任务队列
rq_id = "job_test_id1" # 任务id
rq_job = queue.fetch_job(rq_id) #获取任务
#
if rq_job:
if rq_job.is_finished: #判断任务是否完成
return JsonResponse(
status=200,
data=u'任务完成'
)
elif rq_job.is_failed: #判断任务是否失败
rq_job.delete() #删除任务
return return JsonResponse(
status=201,
data=u'任务失败'
)
else:
return JsonResponse(
status=202,
data=u'运行中'
)
#把任务放入队列中
class PushJob(View):
def get(self, request):
queue = django_rq.get_queue('low') #获取任务队列
rq_id = "job_test_id1" # 任务id
rq_job = queue.fetch_job(rq_id) #获取任务
# 加入任务队列
queue.enqueue_call(
func=test,
args=(
*args
),
timeout=timeout,
job_id=rq_id,
)
return JsonResponse(
status=202,
data=rq_id
)
#需要放入队列的函数
def test():
print('这是第一个test函数')
rq_job = rq.get_current_job()
rq_job.meta['data'] = "aaa"
rq_job.save_meta()
import time
time.sleep(5)
def test1(self):
print('这是第二个test函数')
启动
# 只启动default队列
python manage.py rqworker default
# 需要启动其他队列时只需在default后加上队列名字
python manage.py rqworker default high low
然后重复访问这个接口,直到控制台输出这个,在访问接口,可以看到django控制台输出存入的data=aaa这个值