使用Python将后台处理放在Heroku上
由于许多使用Heroku与Rails的人,以及以Ruby为中心,因此关于日语背景处理的文章很多。我也希望有关Python的文章,所以我会将自己的笔记和记录保留下来。
首先,为什么要在后台进行处理呢?
在Heroku上,如果是普通的HTTP访问,Web dyno会处理它(参考Dyno和Dyno Manager),但是Web dyno会在30秒内超时。
从常理来说,如果在Web处理中需要30秒的时间,那可能是相当重的处理任务或者是需要较长时间完成的特殊处理。
然而,我认为有时候也会有这样的处理情况。
现在,开始实施吧。
在Heroku的开发中心中,确实有关于不仅限于Ruby的其他语言的内容,包括Worker Dynos,后台作业和队列。在这里,我将关于Python进行介绍。
我先说好,几乎就是原样的。
准备好
1. 安装Redis
$ brew install redis #ローカルで開発しないなら入れなくてよい
$ pip install redis
安装RQ(Redis队列)。
$ pip install rq
3. 写下所需的库文件。
$ pip freeze > requirements.txt
创建一个可以调用后台处理的程序。
这个家伙好像可以逐个调用存储在 Redis 上的任务。
import os
import redis
from rq import Worker, Queue, Connection
listen = ['high', 'default', 'low']
redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)
if __name__ == '__main__':
with Connection(conn):
worker = Worker(map(Queue, listen))
worker.work()
5. 写下想要在后台执行的处理任务。
from rq import Queue
from worker import conn
from bottle import route, run
q = Queue(connection=conn)
@route('/index')
def index():
result = q.enqueue(background_process, '引数1')
return result
def background_process(name):
# ここに時間のかかる処理を書く
return name * 10
run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
将worker.py写入Procfile。
web:python main.py
worker:python worker.py
在Heroku的附加组件中添加redistogo
$ heroku addons:create redistogo
部署/部署化
$ git add .
$ git commit -m "add worker"
$ git push heroku master
9. 启动工作人员
$ heroku scale worker=1
辛苦了,步骤已经完成了。
如果你能做到这一步,我认为后台处理会正常运行。
另外,在本地环境中确保安装了Redis服务器,并且如果你正确启动了main.py和worker.py,就可以确认后台处理是否正常运行。
当遭遇困境时,想一想这句话
我们来通过查看日志来解决问题。
$ heroku logs -t -p worker