pythonのファイルをherokuで定期的に実行する方法
この記事ではpythonのファイルに書かれたprint()
を定期的に実行する方法を紹介します。
↓のページを参考にしています。
https://devcenter.heroku.com/articles/clock-processes-python
herokuで適当なアプリケーションを作成していて、remoteへpushできるまで準備が整っている状態を想定しています。
また、custom clock processes
を対象にしています。
pythonファイルを作成する
スケジュール用のライブラリをインストールします。
pip install apscheduler
1分間隔でログをだすようにコードを書きます。
batch.py
from apscheduler.schedulers.blocking import BlockingScheduler sched = BlockingScheduler() @sched.scheduled_job('interval', minutes=1) def timed_job(): print('This job is run every three minutes.') sched.start()
apscheduler
ではなく、schedule
ライブラリを使ってもよいです。
pip install schedule
import schedule import time def job(): print("hello every 10 seconds.") #10秒毎にjobを実行 schedule.every(10).seconds.do(job) while True: schedule.run_pending() time.sleep(1)
Procfileを作成する
clock: python batch.py
requirements.txtを用意する
pip freeze > requirements.txt
herokuにpushする
git add ./ git commit -m "first commit" git push heroku master
↓のようにログが確認できます。
heroku[clock.1]: Starting process with command `python batch.py` heroku[clock.1]: State changed from starting to up app[api]: Build succeeded app[clock.1]: This job is run every three minutes. app[clock.1]: This job is run every three minutes.
注意
custom clock processes
の場合起動中はdynoを消費し続けます。
なので、web1, clock1でscaleしていると、webのみの場合の2倍早く消費されます。
無料内で定期バッチを実行する場合は、add-onを使ったほうが良いでしょう。
(ただし、10分、1時間、1日ごとのみ指定可能です)
add-onの場合は、実行時のみ消費されるので低コストです。
1日ごとに論理削除されたレコードを削除したいといった場合はadd-onを使ったほうがよさそうです。