注目キーワード

【Python】scheduleを使って関数を定期的に実行する

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の機能で、スケジュールされた関数を実際に実行しつつ、時間をすすめています。

実行結果

サンプルの実装を実行すると次のようになります。

[1]と付けた実行が(ほぼ)1秒単位で、[2]と付けた実行が(ほぼ)2秒単位で繰り返されていることがわかります。

デコレータを用いた実装

上の例ではジョブを14行目と15行目で作成していました。scheduleを利用するとき、このようにジョブを作る方法以外に、実行した関数にデコレータと呼ばれる@で始まる文を付けることでジョブを作成することもできます。デコレータを用いた実装を確認してみましょう。

デコレータを用いて定期実行するジョブを作成する

サンプルの実装です。

具体的なaccess_timeの実装は先程と同じですが、関数宣言の上に@ではじまる文を付与してジョブを作成しました。デコレータでは、先程の例と同じように、1秒ごとと2秒ごとに関数を実行するように書いてあります。

実行結果

デコレータを使った実装を実行してみます。

先ほどと同じような実行結果が得られました。

scheduleでジョブを確認し、実行をキャンセルする方法

長めの実行間隔を持つジョブを設定して処理を開始した場合、ジョブを確認したり停止したりすることが想定されます。scheduleに処理を任せた上で、ジョブを確認したり実行を停止することができます。

scheduleを用いてジョブの確認と停止を行うサンプルソース

サンプルの実装です。

スポンサーリンク

実行結果

次のような実行結果になります。

最初に5秒ぐらい処理を動かしたので、(ほぼ)1秒単位で処理が実行されます。

次にジョブの一覧を確認すると、2つのジョブが秒単位と分単位で登録されていることがわかります。

その後一度すべてのジョブをキャンセルした上で、再度ジョブの一覧の確認と実行を行っても、何も出力されないことが分かります。

このようにscheduleを利用することで、定期的に関数を呼び出したり、ジョブ一覧の確認や停止が行えることが分かります。本格的にサーバーで動くプログラムを管理するためにはタスクスケジューラやcronを使うこともありますが、簡単な定期実行のためにPythonのスクリプトも便利なことが分かるかと思います。一度使ってみて頂ければと思います。