使用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这个值

 

 

转载:https://blog.csdn.net/qq_39248122/article/details/103897258

 

-----------------------------------------------------------自己项目配置---------------------------------------------------------

 

 

 

 

 

 

 

 

task.py

复制代码
from django_rq import job

import logging,datetime
logger = logging.getLogger('worker')

@job('default', timeout=360)
def sync_migration_record(msg):
    """同步迁移记录"""
    # print('eeee' + msg)
    times = datetime.datetime.now().strftime('%Y:%m:%d %H:%M:%S')
    with open('task.txt', 'a') as f:
        f.write(msg + '\n')
        f.close()
复制代码

 

 views.py

# 机组信息  /product/product_index
def product_index(request):
    sync_migration_record.delay("hello,rq")
    return JsonResponse({'status': 200,  'msg': "成功"})
    # return render(request, 'node/index.html')

 

posted @   搬砖小伙子  阅读(764)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示