python3 异步消息队列 RQ 处理

rqRedis Queue 的缩写, 一个基于 Redis 的简单、轻量的异步消息队列工具。

如果在网站中用户发起一个用时很久的请求,如果用同步的方式,服务器就会返回超时。这时候就需要用异步请求,用户发起请求后,服务端把作业扔给另一个进程去执行,然后立刻返回给用户,用户再通过轮询或者其他方式来获取作业的执行进度和执行结果。

rqworker 作用就相当于启动一个新的守护进程,监听到有新的任务进来就会执行,而用户发起的请求则立即返回。

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可供使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值