私は Heroku に Python Flask アプリを持っています。これは Web ページを提供しますが、バックグラウンド タスクとして最適に構成されていると思われる特定のタスクを起動することもできます。そのため、Herokurq
チュートリアルに従ってバックグラウンド タスクをセットアップしました。私のProfileは次のようになります:
web: python app.py
worker: python worker.py
ただし、私のプロセスは現在スケーリングされていますweb=1 worker=0
。このバックグラウンド プロセスが頻繁に実行されるわけではないことを考えると、そのための dyno 全体をプロビジョニングしてから、それほど小さなものに月額 34 ドルを支払うのは賢明ではないように思えます。
質問:
worker
Procfile でプロセスを宣言したままにし、スケーリングを に維持した場合web=1 worker=0
、キューに入れられたプロセスは最終的に利用可能な Web dyno で実行されますか? それとも、キューに入れられたプロセスは決して実行されませんか?- キューに入れられたプロセスが決して実行されない場合、たとえば、
twisted
Web アプリでタスクを非同期に実行する以外に、これを行う別の方法はありますか?
追加情報
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()
プロセスをキューに入れるメイン アプリのロジックは次のようになります。
from rq import Queue
from worker import conn
q = Queue(connection=conn)
q.enqueue(myfunction, myargument)