使用 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 错误日志里看到后台进程的详细错误日志来解决问题。