简单的异步任务工具——rq 的使用教程
rq是一个简单的,轻量级的异步任务工具。
如果在网站中用户发起一个用时很久(大于2分钟)的请求,如果用同步的方式,服务器就会返回超时。
这时候就需要用异步请求,用户发起请求后,服务端把作业扔给另一个进程去执行,然后立刻返回给用户,用户再通过轮询或者其他方式来获取作业的执行进度和执行结果。
rq的作用就相当于“另一个进程”。
1.安装
安装python-rq包
pip install rq
2.rq_worker
rq_worker是一个单独的进程,会监听需要执行的任务,并执行。
rq_worker.py
import redis
from rq import Worker, Queue, Connection
listen = ['high', 'default', 'low']
pool = redis.ConnectionPool(db=0, host='localhost', port=6379,
password='passwd')
redis_conn = redis.Redis(connection_pool=pool)
if __name__ == '__main__':
with Connection(redis_conn):
worker = Worker(map(Queue, listen))
worker.work()
启动
python rq_worker.py
3.发布rq作业
1)定义作业执行的函数
funcs.py
def test_func(url, name):
return name
注意的是作业执行的函数和发布任务的模块不能再同一个python文件中,只能通过import来导入。
在这里执行的print的信息会显示在rq_worker的进程中。
from funcs import get_url
from rq import Queue,job
pool = redis.ConnectionPool(db=0, host='localhost', port=6379,
password='passwd')
redis_conn = redis.Redis(connection_pool=pool)
if __name__ == '__main__':
rq_queue=Queue(connection=redis_conn)
job=rq_queue.enqueue(test_func, 'http://www.baidu.com',name='kevin')
先实例化一个Queue类(项目中这个实例可以做成单例)
然后通过enqueue方法,发布任务。第一个参数是执行的function名,后面跟输入给function执行的参数,可以是args也可以是kwargs。
这里会返回一个Job类的实例
4.查看作业执行的情况
发布作业返回的job类,定义位于rq.job文件中,可以去查看一下它的API,主要用到的API有:
print job.result # 如果函数执行正常,返回作业的return,如果有异常,返回None,如果作业没执行,也是返回None
print job.get_status() # 获取作业的状态 queued还在队列中,failed:执行失败,finished 完成
job.set_id('my_id') # 为作业设置一个id,如果没有set_id的操作,作业的id会是一个随机的唯一的字符串
my_id = job.get_id() # 获取作业的id
print job.to_dict() # 把job实例转化成一个字典
job.delete() # 从redis中把该作业删除掉
job.cancel() # 取消作业,尽管作业已经被执行,也可以取消
from rq import job
job.Job.exists(my_id, redis_conn) # 返回是否存在该id的作业
my_job = job.Job(my_id, redis_conn) #创建该作业id的实例
简单的异步任务工具——rq 的使用教程的更多相关文章
- Python极其简单的分布式异步作业管理系统RQ入门
Python极其简单的分布式异步作业管理系统RQ入门 原创 2017-08-19 lixing 生信人 Python极其简单的分布式异步作业管理系统RQ入门 1. 什么是Job? Job直译过来就是工 ...
- 简单的异步Socket实现——SimpleSocket_V1.1
简单的异步Socket实现——SimpleSocket_V1.1 笔者在前段时间的博客中分享了一段简单的异步.net的Socket实现.由于是笔者自己测试使用的.写的很粗糙.很简陋.于是花了点时间自己 ...
- gulp:更简单的自动化构建工具
目前最流行的两种使用JavaScript开发的构建工具是Grunt和Gulp.为什么使用gulp?因为Gulp更简单.Grunt任务拥有大量的配置,会引用大量你实际上并不需要的对象属性,但是Gulp里 ...
- Python开发程序:简单主机批量管理工具
题目:简单主机批量管理工具 需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ### 作者介绍: * au ...
- [Winform]一个简单的账户管理工具
最近一直觉得注册的账户越来越多,帐号密码神马的容易弄混.自己就折腾了一个简单的账户管理工具,其实实现也挺简单,将每个账户的密码及相关密码提示信息,经aes算法加密之后保存到数据库,当前登录用户可以查询 ...
- Android消息机制——时钟显示和异步处理工具类(AsyncTask)
1. 时钟显示 定义布局文件——activity_my_analog_clock_thread_demo.xml <?xml version="1.0" encoding=& ...
- 实现一个简单的http请求工具类
OC自带的http请求用起来不直观,asihttprequest库又太大了,依赖也多,下面实现一个简单的http请求工具类 四个文件源码大致如下,还有优化空间 MYHttpRequest.h(类定义, ...
- 【javascript】Promise/A+ 规范简单实现 异步流程控制思想
——基于es6:Promise/A+ 规范简单实现 异步流程控制思想 前言: nodejs强大的异步处理能力使得它在服务器端大放异彩,基于它的应用不断的增加,但是异步随之带来的嵌套.难以理解的代码让 ...
- DBUtils-对JDBC简单封装的开源工具类库
DBUtils 是对JDBC简单封装的开源工具类 详细介绍地址: https://baike.baidu.com/item/Dbutils/10655914?fr=aladdin 在使用DBUtil ...
随机推荐
- LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。
var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...
- json2使用方法
例子1: //直接声明json数据结构 var myJSONObject = {"bindings": [ {"ircEvent": "PRIVMSG ...
- 深入理解计算机系统第二版习题解答CSAPP 2.20
T2Uw(w)=x, x≥0时 T2Uw(w)=x+2w, x<0时 利用上面的公式,重新计算2.19的问题.
- RDS——mysql主从
测试一:RDS主 RDS从 只需要创建一个RDS数据库实例 1.版本 RDS:5.6.21 2.操作步骤 选中被操作的数据--->点击实例操作---->创建只读副本---& ...
- [改善Java代码]小心switch带来的空值异常
使用枚举定义常量时,会伴有大量的switch语句判断,目的是伪类每个枚举项解释其行为,例如: public class Client { public static void main(String[ ...
- java url中文 编译和解码
js到servlet: js端 var minename='中文'; minename=encodeURI(encodeURI(minename)); java servlet 端 String na ...
- 如何通过PhpMyAdmin批量删除MYSQL数据库数据表
使用这个方法前,强烈建议先备份整个数据库.至于怎么备份?你不会么?在本文下方留言吧. 具体方法:复制下面的php执行语句,保存为sql.php文件(注意配置数据库名称.密码.数据表头),通过ftp上传 ...
- 关于微信response_type参数错误
可能出现问题的几个原因: 1.正确的2.0auth的地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=1%&redire ...
- 软件包 java.util 的分层结构
概述 软件包 类 使用 树 已过时 索引 帮助 JavaTM Platform Standard Ed. 6 上一个 下一个 框架 无框架 所有类 ...
- SQL获取刚插入的记录的自动增长列ID的值
假设表结构如下: CREATE TABLE TestTable ( id int identity, CreatedDate datetime ) SQL2005获得新增行的自动增长列的语句如下: i ...