utamaro’s blog

誰かの役に立つ情報を発信するブログ

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を使ったほうがよさそうです。