Python极其简单的分布式异步作业管理系统RQ入门

原创 2017-08-19 lixing 生信人

Python极其简单的分布式异步作业管理系统RQ入门

1. 什么是Job?

Job直译过来就是工作,可以是任意的Python函数,你可以把你想要异步执行的任务都写成Job函数。简而言之,Job就是你想执行的操作。例如,我想统计任意网页的字符数量,可以写一个这样的Job函数:

import requestsdef count_words(url):
return len(requests.get(url).text.split())

这样一个函数就可以称之为Job。

2. 什么是Queue?

当我有很多Job时,假如我现在有3个Job,分别是j1、j2、j3,那么当计算机要执行这些任务的时候,会按照j1、j2、j3加入的顺序来执行这些Job,这样的一个可以忘里面添加Job,并且能够顺序执行队列称之为Queue。

例如,我们可以这样来构建一个Queue:

import redisfrom rq import Queue

redis_conn = redis.Redis()
q = Queue('default', connection=redis_conn) # 第一个参数是Queue的名称,可以不传,默认为default

3. 怎么把Job放到队列里面去?

j = q.enqueue(count_words, args=('https://www.baidu.com',))

enqueue第一参数是Job函数,args是Job函数的参数,关键字参数可以通过kwargs传入。

4. 什么是Worker?

Worker是Job的消费者,简单来说,你把很多Job加入到了Queue,谁来运行这些Job呢?当然就是Worker啦,你也可以看出Worker必须是独立的进程,这个进程从Redis里面获取Job的信息(包括函数、参数等等),然后运行这个Job。

启动Worker进程也很简单:

$ rq worker low high default
16:56:02 RQ worker 'rq:worker:s2.6443' started, version 0.8.1
16:56:02 Cleaning registries for queue: low
16:56:02 Cleaning registries for queue: high
16:56:02 Cleaning registries for queue: default
16:56:02
16:56:02 *** Listening on low, high, default...

后面的三个参数low、high、default,就是这个Worker将要运行哪些Queue里面的Job,这个顺序很重要,排在前面的Queue里面的Job将优先被运行。

5. 一个完整的例子

jobs.py

import requestsimport redisfrom rq import Queuedef count_words(url):
return len(requests.get(url).text.split())def get_q():
redis_conn = redis.Redis() return Queue(connection=redis_conn)

app.py

from jobs import get_q, count_wordsdef run():
q = get_q()
j = e.enqueue(count_words, 'https://www.baidu.com')
print(j.result)if __name__ == '__main__':
run()

启动Worker:

$ rq worker

运行:

$ python app.py

Python极其简单的分布式异步作业管理系统RQ入门的更多相关文章

  1. Parallel Python——一个简单的分布式计算系统

    如何建立一个高速的分布式计算平台?Parallel python此目的. Parallel Python(http://www.parallelpython.com/content/view/15/3 ...

  2. Python开发【模块】:Celery 分布式异步消息任务队列

    Celery 前言: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个 ...

  3. Python使用multiprocessing实现一个最简单的分布式作业调度系统

    Python使用multiprocessing实现一个最简单的分布式作业调度系统介绍Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机 ...

  4. Python 用Redis简单实现分布式爬虫

    Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台. 连接数据库 注意:假设现有几台在同一局域网内的机器分别为Master和几个Slaver Master连接 ...

  5. django celery的分布式异步之路(二) 高并发

    当你跑通了前面一个demo,博客地址:http://www.cnblogs.com/kangoroo/p/7299920.html,那么你的分布式异步之旅已经起步了. 性能和稳定性是web服务的核心评 ...

  6. django celery的分布式异步之路(一) 起步

    如果你看完本文还有兴趣的话,可以看看进阶篇:http://www.cnblogs.com/kangoroo/p/7300433.html 设想你遇到如下场景: 1)高并发 2)请求的执行相当消耗机器资 ...

  7. 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试

    相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控 用python + hadoop streami ...

  8. 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控

    写在前面 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 用python + hado ...

  9. Python学习笔记 - day14 - Celery异步任务

    Celery概述 关于celery的定义,首先来看官方网站: Celery(芹菜) 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. 简单来看,是一个基于pyt ...

随机推荐

  1. 【剑指offer-25】合并两个单调递增的链表,C++实现(链表)

    原创博客,转载请注明出处! 1.题目 输入两个单调递增的链表,输出两个链表合成后的链表(单调不减). 2.思路(递归) # 鲁棒性: 如果链表1是空链表,则直接输出链表2. 如果链表2是空链表,则直接 ...

  2. Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?

  3. 添加dom节点及优化

    创建并添加dom加点如何进行优化? 1.使用文档片(DocumentFragment) 可以理解为"仓库",用来保存将来可能会添加到DOM中的节点: var fragment = ...

  4. 让thinkphp 5 支持pathinfo 的 nginx ,去掉index.php

    在TP5.0中查阅tp5官方文档,注意:5.0取消了URL模式的概念,并且普通模式的URL访问不再支持.phthinfo 是什么? PHP中的全局变量$_SERVER['PATH_INFO']是一个很 ...

  5. 《DSP using MATLAB》示例9.1

    前段时间发生许多事,主要是楼盘开发商资金链紧张,无法通过验收,拿不到两书一表(住宅质量保证书.住宅使用说明书.房屋建筑工程竣工验收备案表), 各种配套设施都没有,就在这条件下还强制我们业主收房,心塞, ...

  6. 网站使用QQ登录问题小结

    关于网站如何使用QQ登陆这个问题就不多说了,很简单,登陆connect.qq.com找到相应的SDK,下载下来,里面会有demo,将相应的appid,appkey和回调地址callback改成自己的就 ...

  7. python string 之 format, join, split

    功能太强大. 经常看到很多简洁, 高级的用法. 但是基本思路是{}代替了以前的%. In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2] ...

  8. 【Python教程】《零基础入门学习Python》(小甲鱼)

    [Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609

  9. ORM 查询

    ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...

  10. linux tcpdump命令抓包

    tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) 截获主机210.27.48.1 和主机210.27.48.2 或210.27 ...