使用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 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这个值
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值