使用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
bannerAds