こんにちは、皆さん!

今回はPythonを使ってHeroku上でどのようにタスクをスケジュールできるのか紹介していこうと思います。


トピック


Heroku Schedulerとは?

Heroku Scheduler はHerokuのアドオンの一つで、特定の時間に自分のHerokuアプリに指定したコマンドを実行してもらうことができます。魅力的な部分はこれが無料で使えるところです。


こちらのスケジュラーで選べるオプションは下記のようになっております。

Heroku Schedulerの時間設定の選択肢

このように10分ごと、毎時間ごと、または毎日の特定の時間にという感じでいくつかオプションが用意されています。

そして、下のコマンドを打ち込むところで実行してほしいコマンドを入れておけば完成になります。

なお、このようなタスクは一つのアプリにつきたくさん作ることもできますので、例えば、10分ごとにタスクAをやってもらい、毎時間ごとにタスクBをやってもらうというようなこともできます。


簡単なPythonの例

ここからは実際の簡単なPythonの例を見ていきましょう。

まずは簡単なPythonファイルを作成しましょう。これをexample.pyというファイル名にしましょう。

import sys

print("task has been conducted")
sys.stdout.flush()

ここの4行目でやっている内容はこのアウトプットがHerokuのログで表示されるようにするためのものです。

さらにHerokuにデプロイできるようにするために、requirements.txtファイルも作成しましょう(中身は空っぽ)。こちらがないと、HerokuがこのアプリをPythonファイルとして認識してくれませんので。

そしたら後はheroku createでHerokuアプリを生成し、git push heroku masterでローカルのファイルたちを送信すればオッケーです

一方、Herokuの方では、Heroku Schedulerを必要なアドオンとして、アプリに足してあげないといけません。これをやるためにはHerokuのホームページに行き、今回のご自身のアプリを開いてもらって、Resourcesを押してください。

そしたら、アドオンを検索できるインプットボックスが出てくるので、ここでHeroku Schedulerと打って、改行で追加されます。

Heroku Schedulerのアドオンの追加

次にタスクを定義したいので、そのままHeroku Schedulerを押して、開きます。

開いた先で、Add Jobを押して、新しいタスクを追加します。

Add Jobを選択

タスクの追加

これでタスクが一つ追加されました。10分毎に先ほど書いたexample.pyファイルを呼び出します。結果的にログに”task has been conducted”という英語メッセージが10分毎に一つ出てきます。

これを確認するために少なくとも10分が経った後にHerokuのサイト内のMoreというボタンを押して、その中の”View logs”ボタンを押しましょう。

ログを開く

画像内でご覧になれますが、”task has been conducted”というログが10分毎に出ています。

今回ここで使ったコードはこちらに載せておきました。


このような簡単な内容のタスクだとまだ役に立つケースが見当たらないかもしれません。

もう少し有用な活用方法として、下記の記事にまとめたような繰り返し自分のHerokuサイトにアクセスをするというものがあります。Herokuは無料のDynoを使っていると、30分間アクセスがなかった際に、自動的にサイトがスリープします。すると、その状態で次にアクセスしたユーザーはウェブページがロードし終わるまでに少し時間がかかることになります。

これを防ぐことができるのがこの繰り返しHerokuサイトにアクセスするというタスクです。詳しくはこちらの記事から参照してください↓


さらに、その他のものでしたら、Heroku上で指定した時間にスクレイピングをしてもらって、最新情報を掻き集めるというのも面白いでしょう。

詳しい内容に関してはこちらからお願いします↓


まとめ

今回はPythonとHeroku Schedulerを使って指定した時間にタスクを行ってくれる方法を紹介しました。

無料でここまでの機能がついているのはさすが貧民の味方、Herokuって感じです。個人的に少々不便だなと思ったのは30分毎にという選択肢がないことですね。僕は30分毎にしたかったタスクがありましたので。


皆さんの役に立つことを願います!
では、また次回まで✌
記事更新はツイッターで告知するので、ツイッターの方でもフォローお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です