簡單的異步任務工具——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的實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM