使用 RQ 实现后台任务 ####################### 概述 ======= `RQ(Redis Queue) `_ 是一个很常用的基于 Redis 队列的后台任务库,在新浪云上你可以很方便的使用 RQ 来运行后台任务。 安装 ======== 使用 RQ 之前,需要先安装其相关的依赖包到应用的 vendor 目录下。进入应用的代码根目录。 .. code-block:: console $ 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 队列并处理任务。 .. code-block:: python 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`` 文件里的一个这个比较耗时的函数,代码如下: .. code-block:: python import urllib2 def count_words_at_url(url): resp = urllib2.urlopen(url).read() return len(resp.split()) 在 Web 应用程序的处理函数中,使用 `Queue.enqueue` 函数将阻塞的函数调用放入到后台去执行。 .. code-block:: python 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 错误日志里看到后台进程的详细错误日志来解决问题。