Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのイベントスケジューラ入門:scheduleモジュールでタスクを定期実行する方法

Pythonには、指定した時刻や間隔でタスクを自動実行するための汎用スケジューラが用意されています。その中でも手軽に使えるのが、サードパーティ製のscheduleモジュールです。このモジュールでは every 関数を使うことで、直感的な記述で実行スケジュールを組み立てられます。

まずはインストールが必要です。以下のコマンドで導入できます。

pip install schedule

基本構文

schedule.every(n).時間単位.do(関数)
  • n … 実行間隔を表す数値
  • 時間単位 … seconds(秒)、minutes(分)、hours(時間)、days(日)のほか、sunday や monday といった曜日名も指定可能です

たとえば「10秒ごと」なら schedule.every(10).seconds.do(task)、「毎日」なら schedule.every().day.do(task) のように書きます。

実例:Bitcoin価格を定期的に取得する

次の例では、scheduleモジュールを使って数秒おきにビットコインの価格を取得します。価格データはCoinDeskが提供しているAPIから取得し、HTTPリクエストにはrequestsモジュールを使用します。また、プログラムを常時稼働させ続けるためにtimeモジュールのsleep関数も併用します。APIの応答待ちなどで遅延が発生した場合も、sleepによる待機処理が役立ちます。

import schedule
import time
import requests

url = "https://api.coindesk.com/v1/bpi/currentprice.json"
data = requests.get(url)
input = data.json()

def fetch_bitcoin():
    print("Getting Bitcoin Price")
    result = input['bpi']['USD']
    print(result)

def fetch_bitcoin_by_currency(x):
    print("Getting bitcoin price in: ", x)
    result = input['bpi'][x]
    print(result)

# スケジュール登録
schedule.every(4).seconds.do(fetch_bitcoin)
schedule.every(7).seconds.do(fetch_bitcoin_by_currency, 'GBP')
schedule.every(9).seconds.do(fetch_bitcoin_by_currency, 'EUR')

while True:
    schedule.run_pending()
    time.sleep(1)

コードのポイント

  • schedule.every(4).seconds.do(fetch_bitcoin) … 4秒ごとにUSD建ての価格を表示します
  • fetch_bitcoin_by_currency には引数を渡せるため、GBP(英ポンド)やEUR(ユーロ)など通貨を切り替えて同じ関数を使い回せます
  • while True ループ内の schedule.run_pending() が、実行タイミングが来たジョブを順次処理します。これがないとタスクは一切実行されないので注意してください

実行結果

上記のコードを実行すると、次のような出力が得られます。

Getting Bitcoin Price
{'code': 'USD', 'symbol': '$', 'rate': '7,069.1967', 'description': 'United States Dollar', 'rate_float': 7069.1967}
Getting bitcoin price in: GBP
{'code': 'GBP', 'symbol': '£', 'rate': '5,279.3962', 'description': 'British Pound Sterling', 'rate_float': 5279.3962}
Getting Bitcoin Price
{'code': 'USD', 'symbol': '$', 'rate': '7,069.1967', 'description': 'United States Dollar', 'rate_float': 7069.1967}
Getting bitcoin price in: EUR
{'code': 'EUR', 'symbol': '€', 'rate': '6,342.4196', 'description': 'Euro', 'rate_float': 6342.4196}
Getting Bitcoin Price
{'code': 'USD', 'symbol': '$', 'rate': '7,069.1967', 'description': 'United States Dollar', 'rate_float': 7069.1967}

まとめ

scheduleモジュールを使えば、わずか数行のコードで定期的なタスク実行を実現できます。APIからのデータ定期取得、ログ収集、リマインダー処理など、さまざまな自動化シーンで活躍するでしょう。なお、本格的な運用では例外処理の追加や、変数名 input がPythonの組み込み関数と重複しないよう別名に変更することをおすすめします。

  1. 【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説

    はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが

  2. PythonのSimPyではじめる離散イベントシミュレーション入門

    SimPy(発音は「ブリンピー」に似た響き)は、プロセス指向の離散イベントシミュレーションを実現するためのPythonパッケージです。 インストール SimPyをインストールする最も簡単な方法は、pipを使うことです。 pip install simpy 実行すると、以下のような出力が表示されます。 本記事の執筆時点における最新バージョンはsimpy-3.0.11で、以降の例はすべてこのバージョンを使用しています。 すでにSimPyがインストールされている場合は、pipの-Uオプションでアップグレードできます。 pip install -U simpy 注意:Python 2.7以上が必