Herokuでは、DjangoアプリケーションをWeb Dynoで実行させることができます.Djangoアプリケーションは、アプリケーションの提供とタスクのスケジューリングを担当します。 たとえば、(コードを実行してテストしなかったことに注意してください):
after_hours.py
を作成します。これは、予定する予定の機能を持ちます(ワーカーでも同じソースコードを使用します)。あなたのviews.py
で
def after_6_hours():
print('6 hours passed.')
rq
(タスクをスケジュールするために持っているとしてだけでrq
があなたの状況では十分ではないことに注意)とrq-scheduler
を使用して:
from redis import Redis
from rq_scheduler import Scheduler
from datetime import timedelta
from after_hours import after_6_hours
def create_game():
print('Game created')
scheduler = Scheduler(connection=Redis()) # Get a scheduler for the "default" queue
scheduler.enqueue_in(timedelta(hours=6), after_6_hours) #schedules the job to run 6 hours later.
create_game()
を呼び出すと、(after_6_hoursをスケジュールする必要があります)を実行します6時間後。
ヒント:Redis To Go
アドオンを使用して、HerokuにRedis
をプロビジョニングできます。
次のステップでは、1分ごとにRedisをポーリングしてその時点で実行するジョブがあるかどうかを調べ、それをキューに入れます(rq
のワーカーがリッスンします)。今
、Worker Dynoにafter_hours.py
def after_6_hours():
print('6 hours passed.')
#Better return something
ファイルを作成し、別のファイルworker.py
作成:
import os
import redis
from rq import Worker, Queue, Connection
from after_hours import after_6_hours
listen = ['high', 'default', 'low'] # while scheduling the task in views.py we sent it to default
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()
とスケジュールされたタスクを実行する必要があり、このworker.py
python worker.py
を実行します(この場合は)をWorker Dynoに追加します。 ここでのキーは、同じソースコード(この場合はafter_hours.py
)を作業者にも提供することです。同じことがdocs
は、その労働者と作業発電シェアは正確に 同じソースコードを確認してくださいrq
で強調されています。
もし役に立つとすれば、docsには異なるコードベースを扱うヒントがあります。ウェブプロセスは労働者で実行されているソースコード へのアクセス権を持っていない場合のために
(つまり、コードベースのXは、コードベースのYから遅れた機能 を呼び出します)、あなたは文字列として関数を渡すことができます参照、 もあります。
q = Queue('low', connection=redis_conn)
q.enqueue('my_package.my_module.my_func', 3, 4)
うまくいけばrq-scheduler
すぎて、文字列の代わりに関数オブジェクトを渡すこの方法を尊重します。
このことを理解している限り、任意のモジュール/スケジューリングツール(Celery/RabbitMQ、APSchedulerなど)を使用できます。
あなたは複数のノードに分散されたWebアプリケーションを持っていて、6時間後にノードの1つで1つのタスク(関数を呼び出す)を実行したいのです...なぜ[Celery](http: //celery.readthedocs.org/en/latest/userguide/calling.html)何が必要ですか? –
@PeterBrittain Herokuはノードとその環境を抽象化しました。それはdynoと呼ばれています。私の心配はノードについてではありません。私の懸念は、この環境内で完全に機能するジョブスケジューリングシステムを持つことができることであり、私は方法を考えることができません。おそらく私は3つのdynosを持つ必要があることを覚えています。 1つは私のアプリケーションを提供するためのもの、もう1つはスケジュールされたジョブを解析するスケジューラー用のものと、それらのタスクを実行するためのものです。そして、私の "views.py"では、スケジューラーdynoがそれを解析できるように、スケジュールされたジョブのそのデータベースに追加したいと思っています。さて、私はこの設定を準備したいと思います。 –
私はセラーリーを稼働させたり、基本的に他のジョブスケジューラーと適切な文書を手に入れることができます。詳細は重要ではありません。私は、ジョブ/タスクのスケジューリングのこのシステムを持つより大きなイメージを探しています。 –