rq 是 Redis Queue 的缩写, 一个基于 Redis 的简单、轻量的异步消息队列工具。
如果在网站中用户发起一个用时很久的请求,如果用同步的方式,服务器就会返回超时。这时候就需要用异步请求,用户发起请求后,服务端把作业扔给另一个进程去执行,然后立刻返回给用户,用户再通过轮询或者其他方式来获取作业的执行进度和执行结果。
rq 的 worker 作用就相当于启动一个新的守护进程,监听到有新的任务进来就会执行,而用户发起的请求则立即返回。
worker
任务监听,守护进程。
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from redis import Redis
from rq import Worker,Connection
QUEUES = ['default']
redis_url = 'redis://127.0.0.1:6379/15'
redis_connection = Redis.from_url(redis_url)
def run_worker():
with Connection(redis_connection):
worker = Worker(QUEUES)
worker.work()
if __name__ == '__main__':
run_worker()
send
发送消息队列。
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from rq import Queue
from task import task
from redis import Redis
redis_url = 'redis://127.0.0.1:6379/15'
redis_connection = Redis.from_url(redis_url)
queue = Queue(connection=redis_connection)
if __name__ == '__main__':
job = queue.enqueue(task,name='异步队列')
print(job.get_status())
task
实际执行的任务。
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import time
def task(name):
time.sleep(2)
print(name)
time.sleep(2)
return name
启动 worker 。
(demo) MacBook:RQ zhangyi$ python worker.py
12:30:57 Worker rq:worker:3f2e384e636941939f7a054f20ad3ba5: started,version 1.6.1
12:30:57 Subscribing to channel rq:pubsub:3f2e384e636941939f7a054f20ad3ba5
12:30:57 *** Listening on default...
12:31:00 default: task.task(name='异步队列') (b539426a-9776-4b11-810d-a2d73c779c18)
异步队列
12:31:04 default: Job OK (b539426a-9776-4b11-810d-a2d73c779c18)
12:31:04 Result is kept for 500 seconds
执行发送任务。
(demo) MacBook:RQ zhangyi$ python send.py
queued
(demo) MacBook:RQ zhangyi$
查看作业执行的情况。
如果函数执行正常,返回作业的return,如果有异常,返回None,如果作业没执行,也是返回None。
print(job.result)
获取作业的状态 queued 还在队列中,Failed:执行失败,finished 完成。
print(job.get_status())
为作业设置一个 id,如果没有set_id 的操作,作业的id会是一个随机的唯一的字符串。
job.set_id('my_id')
获取作业的 id。
my_id = job.get_id()
把job实例转化成一个字典。
print(job.to_dict())
从redis中把该作业删除掉。
print(job.delete())
取消作业,尽管作业已经被执行,也可以取消。
print(job.cancel())
返回是否存在该id的作业。
from rq import job
job.Job.exists(my_id,redis_conn)
创建该作业id的实例。
from rq import job
my_job = job.Job(my_id,redis_conn)
如果我们项目使用的是 Flask ,有专门的组件 Flask-RQ2 可供使用。 (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|