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

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

1. 什么是Job?

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

import requests

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

这样一个函数就能够称之为Job。redis

2. 什么是Queue?

当我有不少Job时,假如我如今有3个Job,分别是j一、j二、j3,那么当计算机要执行这些任务的时候,会按照j一、j二、j3加入的顺序来执行这些Job,这样的一个能够忘里面添加Job,而且可以顺序执行队列称之为Queue。bash

例如,咱们能够这样来构建一个Queue:app

import redis
from 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将优先被运行。url

5. 一个完整的例子

jobs.pycode

import requests
import redis
from rq import Queue


def 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_words

def 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
相关文章
相关标签/搜索