Table of Contents

上一个主题

运行环境

下一个主题

服务列表

本页

使用 RQ 实现后台任务

概述

RQ(Redis Queue) 是一个很常用的基于 Redis 队列的后台任务库,在新浪云上你可以很方便的使用 RQ 来运行后台任务。

安装

使用 RQ 之前,需要先安装其相关的依赖包到应用的 vendor 目录下。进入应用的代码根目录。

$ pip install -t vendor rq
Downloading/unpacking rq
Downloading rq-0.1.2.tar.gz
Running setup.py egg_info for package rq
  ...
Successfully installed rq

将 vendor 目录和应用代码一起提交入代码仓库,即可在服务端的代码里使用 RQ 了。

创建后台工作进程

创建一个 worker.py 文件,这个模块会监听 Redis 队列并处理任务。

import redis
from rq import Worker, Queue, Connection

# 你需要先创建一个 Redis,然后将 Redis 的 URL 替换到下面
conn = redis.from_url(REDIS_URL)

listen = ['high', 'default', 'low']

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

在应用代码根目录下创建一个 Procfile 文件,如下添加一个新的后台进程。

worker: python worker.py

添加后台任务

假设我们需要在 Web 应用程序中调用 utils.py 文件里的一个这个比较耗时的函数,代码如下:

import urllib2

def count_words_at_url(url):
    resp = urllib2.urlopen(url).read()
    return len(resp.split())

在 Web 应用程序的处理函数中,使用 Queue.enqueue 函数将阻塞的函数调用放入到后台去执行。

from rq import Queue
# 这个是在之前的 worker.py 里创建的 redis 连接
from worker import conn
q = Queue(connection=conn)

from utils import count_words_at_url
q.enqueue(count_words_at_url, 'http://www.sinacloud.com')

执行完 enqueue 后,任务就会被添加到 Redis 队列中去异步执行,后台进程会不停的从 Redis 队列中取出任务并执行。

部署

将上面的代码提交入代码仓库并 push 到服务端,ta-dah! 完成。你可以在『应用/后台进程』页面来重启或者调整进程数目。如果进程启动有问题,你可以在 HTTP 错误日志里看到后台进程的详细错误日志来解决问题。