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的實例