RQ (Redis Queue) 可以讓 Heroku 平台上的 Python 應用輕松的執行後台任務,RQ 使用 Redis 作為隊列存儲,因此要使用 RQ 之前必須配置應用程序然後啟動並運行一個工作進程。
可使用 pip 命令來安裝 RQ 以及其依賴的庫
1
$ pip
install
rq
2
Downloading/unpacking rq
3
Downloading rq-0.1.2.
tar
.gz
4
Running setup.py egg_info
for
package rq
5
...
6
Successfully installed rq
接下來,記錄新的修改到應用中的 requirements.txt
文件:
1
$ pip freeze > requirements.txt
現在你已經准備好創建 worker 工作進程,創建名為 worker.py 的文件,該模塊將偵聽隊列中的任務並在接收到時處理它們。
01
import
os
02
03
import
redis
04
from
rq
import
Worker, Queue, Connection
05
06
listen
=
[
'high'
,
'default'
,
'low'
]
07
08
redis_url
=
os.getenv(
'REDISTOGO_URL'
,
'redis://localhost:6379'
)
09
10
conn
=
redis.from_url(redis_url)
11
12
if
__name__
=
=
'__main__'
:
13
with Connection(conn):
14
worker
=
Worker(
map
(Queue, listen))
15
worker.work()
使用下面的命令來運行 workder 進程:
1
$ python worker.py
為了將作業放到 Redis 隊列中,我們在外部模塊中編寫一個堵塞函數 utils.py:
1
import
requests
2
3
def
count_words_at_url(url):
4
resp
=
requests.get(url)
5
return
len
(resp.text.split())
然後在你的應用中可通過如下代碼來創建 RQ 隊列:
1
from
rq
import
Queue
2
from
worker
import
conn
3
4
use_connection(conn)
5
q
=
Queue()
而將作業放到隊列的方法如下:
1
from
utils
import
count_words_at_url
2
3
result
=
q.enqueue(count_words_at_url,
'http://heroku.com'
)
該堵塞方法將自動的在後端的 workder 進程中執行。
為了發布新的 worker 系統到 Heroku 中,你需要在 Procfile 中添加運行命令:
1
rq: python worker.py
然後添加 Redis To Go 擴展:
1
$ heroku addons:add redistogo
2
----> Adding redistogo to secret-samurai-42...
done
, v10 (
free
)
一旦做完上述步驟,可根據需要來設定 worker 的數量:
1
$ heroku scale rq=1
2
Scaling rq processes...
done
, now running 1
通過 -p 參數來查看 worker 進程的輸出信息
1
$ heroku logs -p rq -t
也可以手工調用:
1
$ heroku run python worker.py
2
Running python worker.py attached to terminal... up, run.1