1. 程式人生 > >簡單的非同步任務工具——rq 的使用教程

簡單的非同步任務工具——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的例項