zoukankan      html  css  js  c++  java
  • RQ(redis queue)使用简介

    详情请见:flask后台作业--rq方案

    为什么使用任务队列?

    目的是应用程序中运行时间长或者复杂的异步任务进程优化。防止阻塞对客户端的响应,公认的做法是将耗时长的任务移交到worker进程(进程池)

    什么是任务队列?

    任务队列为后台作业提供了一个便捷的解决方案。 Worker进程独立于应用程序运行,甚至可以位于不同的系统上。 应用程序和worker之间的通信是通过消息队列完成的。 应用程序提交作业,然后通过与队列交互来监视其进度。 下图展示了一个典型的实现:

    Python中最流行的任务队列是Celery。 这是一个相当复杂的软件包,它有很多选项并支持多个消息队列。 另一个流行的Python任务队列是Redis Queue(RQ),它牺牲了一些灵活性,比如只支持Redis消息队列,但作为交换,它的建立要比Celery简单得多。

    Celery和RQ都非常适合在Flask应用程序中支持后台任务,所以我倾向于选择更简单的RQ。 不过,用Celery实现相同的功能其实也不难。 如果你对Celery更感兴趣,可以阅读作者的博客中的Using Celery with Flask文章。

    使用RQ

    RQ是一个标准python第三方软件包

    (venv) $ pip install rq
    (venv) $ pip freeze > requirements.txt
    

    此处生成requirements.txt包含了所有安装过的包的信息(方便在其他环境部署),如:

    pip3 install -r requirements.txt
    

    使用消息队列RQ需要运行Redis服务器,因为我是win10为环境,这里有个坑就是,作者教程似乎是linux系统,因为按照他的教程会出现使用fork的地方,windows平台就会报错。为了减少折腾,我这里使用wsl,另外不知道是我环境配置问题还是什么问题,有两个坑需要注意

    • 在wsl使用上述命令会导致报错,但是一旦使用virtualenv创建的虚拟环境进行相同命令就一切正常了
    #安装
    sudo pip3 install python3-virtualenv
    #创建名为venv的虚拟环境
    virtualenv venv
    #使用
    source venv/bin/activate
    
    • 另外建议把pip换成国内源或者使用-i 某国内源,否则有些包下载会因为超时而报错
    #全局操作,pip,pip3通用
    mkdir ~/.pip
    vim ~/.pip/pip.conf
    # 然后将下面这两行复制进去就好了
    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple
    #国内其他源参考
        清华:https://pypi.tuna.tsinghua.edu.cn/simple
        中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
        华中理工大学:http://pypi.hustunique.com/
        山东理工大学:http://pypi.sdutlinux.org/
        豆瓣:http://pypi.douban.com/simple/
    
    #临时换源
    sudo pip3 install 某个因为timeout报错的包 -i 镜像源url
    

    RQ操作

    • 启动redis-server:sudo service redis-server start
    • 创建任务:在app/tasks.py中创建函数,包含一些业务逻辑操作
    • 运行RQ Worker:使用rq worker sometasks启动一个worker进程
    • 执行任务:
    >>> from redis import Redis
    >>> import rq
    >>> queue = rq.Queue('microblog-tasks', connection=Redis.from_url('redis://'))
    >>> job = queue.enqueue('app.tasks.example', 23) # 之前创建的函数,函数参数
    >>> job.get_id()
    'c651de7f-21a8-4068-afd5-8b982a6f6d32'
    

    参考:

    日积月累,水滴石穿
  • 相关阅读:
    Luogu2751 [USACO Training4.2]工序安排Job Processing
    BZOJ4653: [Noi2016]区间
    BZOJ1537: [POI2005]Aut- The Bus
    CF1041F Ray in the tube
    POJ1186 方程的解数
    Luogu2578 [ZJOI2005]九数码游戏
    BZOJ2216: [Poi2011]Lightning Conductor
    CF865D Buy Low Sell High
    BZOJ1577: [Usaco2009 Feb]庙会捷运Fair Shuttle
    几类区间覆盖
  • 原文地址:https://www.cnblogs.com/lonelyisland/p/12846528.html
Copyright © 2011-2022 走看看