使用 Python RQ 的 Python 执行后台任务
目录
- 安装 RQ
- 将任务队列化
- 在 Heroku 上发布
- 调试
- 扩展阅读
RQ (Redis Queue) 可以让 Heroku 平台上的 Python 应用轻松的执行后台任务,RQ 使用 Redis 作为队列存储,因此要使用 RQ 之前必须配置应用程序然后启动并运行一个工作进程。
安装 RQ
可使用 pip 命令来安装 RQ 以及其依赖的库
2 |
Downloading/unpacking rq |
3 |
Downloading rq-0.1.2. tar .gz |
4 |
Running setup.py egg_info for package rq |
6 |
Successfully installed rq |
接下来,记录新的修改到应用中的 requirements.txt
文件:
1 |
$ pip freeze > requirements.txt |
现在你已经准备好创建 worker 工作进程,创建名为 worker.py 的文件,该模块将侦听队列中的任务并在接收到时处理它们。
04 |
from rq import Worker, Queue, Connection |
06 |
listen = [ 'high' , 'default' , 'low' ] |
08 |
redis_url = os.getenv( 'REDISTOGO_URL' , 'redis://localhost:6379' ) |
10 |
conn = redis.from_url(redis_url) |
12 |
if __name__ = = '__main__' : |
13 |
with Connection(conn): |
14 |
worker = Worker( map (Queue, listen)) |
使用下面的命令来运行 workder 进程:
将作业放到队列
为了将作业放到 Redis 队列中,我们在外部模块中编写一个堵塞函数 utils.py:
3 |
def count_words_at_url(url): |
4 |
resp = requests.get(url) |
5 |
return len (resp.text.split()) |
然后在你的应用中可通过如下代码来创建 RQ 队列:
2 |
from worker import conn |
而将作业放到队列的方法如下:
1 |
from utils import count_words_at_url |
3 |
result = q.enqueue(count_words_at_url, 'http://heroku.com' ) |
该堵塞方法将自动的在后端的 workder 进程中执行。
发布到 Heroku
为了发布新的 worker 系统到 Heroku 中,你需要在 Procfile 中添加运行命令:
然后添加 Redis To Go 扩展:
1 |
$ heroku addons:add redistogo |
2 |
----> Adding redistogo to secret-samurai-42... done , v10 ( free ) |
一旦做完上述步骤,可根据需要来设定 worker 的数量:
2 |
Scaling rq processes... done , now running 1 |
调试
通过 -p 参数来查看 worker 进程的输出信息
也可以手工调用:
1 |
$ heroku run python worker.py |
2 |
Running python worker.py attached to terminal... up, run.1 |
评论暂时关闭