Webサイトに定期的にアクセスする場合など、Pythonで実装したプログラムを、定期的に実行しなければならないことがあります。
定期的にプログラムを実行するにはWindowsのタスクスケジューラを使う方法や、Linuxであればcronなどの仕組みを使う方法がありますが、こちらの記事ではPythonのライブラリであるscheduleを使って定期実行する方法を紹介します。
scheduleのインストール
今回の記事で利用するライブラリをインストールするために、pip install scheduleを実行します。
scheduleを利用して関数を定期的に実行する
scheduleを用いることで、関数を実行する単位としてジョブを管理し、実行や停止などを行うことができます。サンプルソースで使い方を確認してみます。
scheduleを用いて定期実行するサンプルソース
scheduleを利用するサンプルの実装です。
関数を作る部分と、定期的に実行するパートに分かれています。
関数を作るパートでは、urllibとjsonを利用してaccess_timeという関数を作りました。こちらの実装については、urllibの例とjsonの例 も参考にしてください。これらのライブラリを用いて WorldTimeAPI へアクセスすることで、Tokyo/Asiaの情報をJSON形式で取得し、Pythonの辞書型データを作成した上で、時間を出力しています。
定期的に実行するパートでは、scheduleの機能を使って1秒ごとと2秒ごとに関数を呼び出し、それぞれprintするときに[1]と[2]を先頭に付けてprintするように設定しています。最後に、scheduleの機能で、スケジュールされた関数を実際に実行しつつ、時間をすすめています。
実行結果
サンプルの実装を実行すると次のようになります。

デコレータを用いた実装
上の例ではジョブを14行目と15行目で作成していました。scheduleを利用するとき、このようにジョブを作る方法以外に、実行した関数にデコレータと呼ばれる@で始まる文を付けることでジョブを作成することもできます。デコレータを用いた実装を確認してみましょう。
デコレータを用いて定期実行するジョブを作成する
サンプルの実装です。
具体的なaccess_timeの実装は先程と同じですが、関数宣言の上に@ではじまる文を付与してジョブを作成しました。デコレータでは、先程の例と同じように、1秒ごとと2秒ごとに関数を実行するように書いてあります。
実行結果
デコレータを使った実装を実行してみます。

先ほどと同じような実行結果が得られました。
scheduleでジョブを確認し、実行をキャンセルする方法
長めの実行間隔を持つジョブを設定して処理を開始した場合、ジョブを確認したり停止したりすることが想定されます。scheduleに処理を任せた上で、ジョブを確認したり実行を停止することができます。
scheduleを用いてジョブの確認と停止を行うサンプルソース
サンプルの実装です。
スポンサーリンク
実行結果
次のような実行結果になります。

最初に5秒ぐらい処理を動かしたので、(ほぼ)1秒単位で処理が実行されます。
次にジョブの一覧を確認すると、2つのジョブが秒単位と分単位で登録されていることがわかります。
その後一度すべてのジョブをキャンセルした上で、再度ジョブの一覧の確認と実行を行っても、何も出力されないことが分かります。
このようにscheduleを利用することで、定期的に関数を呼び出したり、ジョブ一覧の確認や停止が行えることが分かります。本格的にサーバーで動くプログラムを管理するためにはタスクスケジューラやcronを使うこともありますが、簡単な定期実行のためにPythonのスクリプトも便利なことが分かるかと思います。一度使ってみて頂ければと思います。