Les articles de traitement d'arrière-plan japonais sont principalement Ruby, probablement parce que de nombreuses personnes utilisent Rails avec Heroku. Je voulais aussi un article sur Python, donc je garderai une trace de mes propres notes.
Dans Heroku, web dyno
gère l'accès HTTP normal (Reference Dynos and the Dyno Manager),
web dyno
expirera dans 30 secondes.
Si vous y réfléchissez normalement, il faut 30 secondes pour traiter le Web, ce qui est un processus très lourd ou un processus spécial qui prend du temps.
Cependant, il peut arriver que vous souhaitiez le faire.
Le centre de développement de Heroku convient également pour les langues autres que Ruby Il a été écrit dans Worker Dynos, Background Jobs and Queuing. Ici, je vais écrire sur Python.
Je dois dire qu'il reste presque ici.
$ brew install redis #Si vous ne développez pas localement, vous n'avez pas à entrer
$ pip install redis
$ pip install rq
$ pip freeze > requirements.txt
Il semble que ce type appellera les emplois accumulés dans les redis un par un.
worker.py
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()
main.py
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, 'Argument 1')
return result
def background_process(name):
#Écrivez un processus chronophage ici
return name * 10
run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
Procfile
web:python main.py
worker:python worker.py
$ heroku addons:create redistogo
$ git add .
$ git commit -m "add worker"
$ git push heroku master
$ heroku scale worker=1
À ce stade, je pense que le traitement en arrière-plan fonctionnera correctement. De plus, si vous placez correctement le serveur redis dans l'environnement local, vous pouvez vérifier que le traitement en arrière-plan fonctionne si vous démarrez correctement main.py et worker.py.
Résolvons-le en regardant le journal.
$ heroku logs -t -p worker
Recommended Posts