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
相關文章
相關標籤/搜索