使用django-rq实现django的异步请求

使用django-rq实现django的异步请求
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码 

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说使用django-rq实现django的异步请求,希望能够帮助大家进步!!!

环境:
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 Viewimport django_rqimport rqfrom 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这个值
在这里插入图片描述

本文来源it小白求知路,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/29167

发表评论