RQ を使用した Python でのバックグラウンドタスク
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年07月18日(月)
Table of Contents
RQ (Redis Queue) により、Heroku 上の Python アプリケーションにバックグラウンドタスクを追加することが簡単になります。RQ は、Redis データベースをキューとして使用してバックグラウンドジョブを処理します。RQ の使用を開始するには、アプリケーションを設定した後、そのアプリケーションで ワーカープロセスを実行する必要があります。
設定
RQ とその依存関係を設定するには、Pip を使用してそれをインストールします。
$ pip install rq
必ず、requirements.txt
ファイルにも rq
を追加してください。
ワーカーを作成する
これでワーカープロセスの作成に必要なすべてのものが用意されたので、作成を開始しましょう。
worker.py
と呼ばれるファイルを作成します。このモジュールは、受信された、キューに入れられたタスクやプロセスをリッスンします。
import os
import redis
from rq import Worker, Queue, Connection
listen = ['high', 'default', 'low']
redis_url = os.getenv('REDIS_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)
if __name__ == '__main__':
with Connection(conn):
worker = Worker(map(Queue, listen))
worker.work()
ここで、新しいワーカープロセスを実行できます。
$ python worker.py
ジョブのキューイング
新しい Redis Queue にジョブを送信するには、コードで Redis にジョブを送信する必要があります。外部モジュール utils.py
内にブロック関数があるとします。
import requests
def count_words_at_url(url):
resp = requests.get(url)
return len(resp.text.split())
アプリケーションで、RQ キューを作成します。
from rq import Queue
from worker import conn
q = Queue(connection=conn)
次に、関数呼び出しをキューに入れます。
from utils import count_words_at_url
result = q.enqueue(count_words_at_url, 'http://heroku.com')
このブロック関数は、バックグラウンドワーカープロセスで自動的に実行されます。
デプロイ
Heroku に新しいワーカーシステムをデプロイするには、そのワーカープロセスをプロジェクトのルートにある Procfile に追加する必要があります。
worker: python worker.py
さらに、Heroku Data for Redis (heroku-redis) アドオンで Redis のインスタンスをプロビジョニングし、git push
を使用してデプロイします。
$ heroku addons:create heroku-redis
----> Adding heroku-redis to example-app... done, v10 (free)
$ git push heroku main
Counting objects: 5, done.
Delta compression using up to 4 threads.
...
すべてがプッシュされたら、ニーズに従ってワーカーをスケーリングします。
$ heroku scale worker=1
Scaling worker processes... done, now running 1
トラブルシューティング
-p
フラグと worker
プロセスタイプの名前でログをフィルタリングしてワーカープロセスの出力を表示します。
$ heroku logs -t -p worker
さらに分離させるために手動でワーカープロセスを起動できます。
$ heroku run worker
Running worker attached to terminal... up, run.1