26

私は Heroku に Python Flask アプリを持っています。これは Web ページを提供しますが、バックグラウンド タスクとして最適に構成されていると思われる特定のタスクを起動することもできます。そのため、Herokurqチュートリアルに従ってバックグラウンド タスクをセットアップしました。私のProfileは次のようになります:

web: python app.py
worker: python worker.py

ただし、私のプロセスは現在スケーリングされていますweb=1 worker=0。このバックグラウンド プロセスが頻繁に実行されるわけではないことを考えると、そのための dyno 全体をプロビジョニングしてから、それほど小さなものに月額 34 ドルを支払うのは賢明ではないように思えます。

質問:

  • workerProcfile でプロセスを宣言したままにし、スケーリングを に維持した場合web=1 worker=0、キューに入れられたプロセスは最終的に利用可能な Web dyno で実行されますか? それとも、キューに入れられたプロセスは決して実行されませんか?
  • キューに入れられたプロセスが決して実行されない場合、たとえば、twistedWeb アプリでタスクを非同期に実行する以外に、これを行う別の方法はありますか?

追加情報

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)
4

5 に答える 5

13

次のように変更Procfileします。

web: bin/web

ディレクトリを作成し、次のようなbinファイルを作成します。bin/web

#!/bin/bash
python app.py &
python worker.py

このファイルに実行権限を付与してください。

$ chmod +x bin/web
于 2012-09-28T07:08:36.083 に答える
3

現在、1 つの dyno のみを使用して、Heroku で Web スケジューラとバックエンド スケジューラの両方を実行しています。

アイデアは、Heroku が 1 つの dyno で開始するための 1 つのメイン Python スクリプトを提供することです。このスクリプトは、Web サーバー プロセスと顧客スケジューラ プロセスの両方を開始するために使用されます。その後、ジョブを定義してカスタム スケジューラに追加できます。

私の場合はAPSchedulerを使用しています。

これは私がしたことです:

プロファイル内:

 web: python run_app.py    #the main startup script

run_app.py で:

# All the required imports
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
from apscheduler.triggers.cron import CronTrigger
from run_housekeeping import run_housekeeping
from apscheduler.schedulers.background import BackgroundScheduler
import os

def run_web_script():
    # start the gunicorn server with custom configuration
    # You can also using app.run() if you want to use the flask built-in server -- be careful about the port
    os.system('gunicorn -c gunicorn.conf.py web.jobboard:app --debug')  

def start_scheduler():

     # define a background schedule 
     # Attention: you cannot use a blocking scheduler here as that will block the script from proceeding.
     scheduler = BackgroundScheduler()

     # define your job trigger
     hourse_keeping_trigger = CronTrigger(hour='12', minute='30')

     # add your job
     scheduler.add_job(func=run_housekeeping, trigger=hourse_keeping_trigger)

     # start the scheduler
     scheduler.start()


def run():
    start_scheduler()
    run_web_script()

if __name__ == '__main__':
    run()

また、Gunicorn から Web を提供するために 4 つのワーカー プロセスを使用しています。これは完全に正常に動作します。

gunicorn.conf.py で:

loglevel = 'info'
errorlog = '-'
accesslog = '-'
workers = 4

例として、このプロジェクトをチェックアウトすることをお勧めします: Zjobs@Github

于 2014-11-26T14:18:01.720 に答える
1

godmonitなどのプロセス マネージャーを使用できます。

神を使えば、次のように構成をセットアップできます

God.watch do |w|
  w.name = "app"
  w.start = "python app.py"
  w.keepalive
end

God.watch do |w|
  w.name = "worker"
  w.start = "python worker.py"
  w.keepalive
end

次に、これをProfileに入れます

god -c path/to/config.god -D

デフォルトでは、プロセスがクラッシュした場合にプロセスを自動的に再起動します。また、メモリ使用量が高くなりすぎた場合にアプリを再起動するように構成できます。ドキュメントを確認してください。

于 2014-03-03T00:34:36.657 に答える
-2

10 分ごとなどのスケジュールされた間隔で特定のタスクを実行できるHeroku スケジューラを確認する必要があります。ワーカーのセットアップが既にある場合は、次を追加できます。

heroku run worker
于 2012-09-28T14:58:23.930 に答える