簡單的非同步任務工具 rq 的使用教程

2021-09-07 03:25:43 字數 2074 閱讀 1572

rq是乙個簡單的,輕量級的非同步任務工具。

如果在**中使用者發起乙個用時很久(大於2分鐘)的請求,如果用同步的方式,伺服器就會返回超時。

這時候就需要用非同步請求,使用者發起請求後,服務端把作業扔給另乙個程序去執行,然後立刻返回給使用者,使用者再通過輪詢或者其他方式來獲取作業的執行進度和執行結果。

rq的作用就相當於「另乙個程序」。

安裝python-rq包

pip install rq
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
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, '',name='kevin')

先例項化乙個queue類(專案中這個例項可以做成單例)

然後通過enqueue方法,發布任務。第乙個引數是執行的function名,後面跟輸入給function執行的引數,可以是args也可以是kwargs。

這裡會返回乙個job類的例項

發布作業返回的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的例項

Swoole Task 簡單高效的非同步任務處理框架

歡迎 star 提 issues 127.0.0.1 9510 ctrl action?paramas action對應 ctrl.php檔案中的 action action 的最後必須返回 this ret,即最後一句 return this ret 127.0.0.1 9510?op ctrl....

Flask celery非同步任務佇列的使用

celery非同步任務佇列 目錄結構樹 配置檔案config.py 設定中間人位址 broker url redis 主main.py import sys import os from celery import celery from flask import flask from flask ...

Junit工具的簡單使用

windows平台,工具為intellij 使用junit完成一次向 helloworld 那樣基礎的測試 導包 需要兩個類 需要測試的類和進行測試的類 import org.junit.test import static org.junit.assert.assertequals public ...