LoginSignup
98
90

More than 5 years have passed since last update.

Python Scheduleライブラリでジョブ実行

Last updated at Posted at 2019-01-17

アジェンダ

  • はじめに
  • ライブラリの紹介
  • 利用例の紹介

はじめに

スクレイピング等でPythonを定期実行させるために利用したライブラリがとても便利だったので紹介します。

ライブラリの紹介

Pythonの定期実行には下記のライブラリを使いました。
Scheduleライブラリ

Python job scheduling for humans.

An in-process scheduler for periodic jobs that uses the builder pattern for configuration. Schedule lets you run Python functions (or any other callable) periodically at pre-determined intervals using a simple, human-friendly syntax.

人のためのPythonジョブスケジューリング

読みやすい構文を使い、Python関数や呼び出し可能オブジェクトを定期実行させることができます、とのこと。

使い方


pip install schedule
import schedule
import time

def job():
    # 定期実行させたい処理
    print('Do Action')

def main():
    # 10分ごと
    schedule.every(10).minutes.do(job)

    # 2時間ごと
    schedule.every(2).hours.do(job)

    # 毎日10時
    schedule.every().day.at("10:00").do(job)

    # 毎週月曜日
    schedule.every().monday.do(job)

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

解説

schedule.every(10).minutes.do(job)

schedule.every で定期実行するためのジョブをライブラリに登録しています。
登録したジョブは実行時間などを管理していますが、次に記載するshedule.run_pendingが呼び出されるまで、ジョブは実行されません。

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

登録したジョブを実行させるための処理です。
schedule.run_pendingは登録したジョブを実行しますが、1回の呼び出しでは1回のジョブしか実行されません。
例えば、毎秒1回のジョブschedule.every(1).second().do(xx)を用意したとしてもschedule.run_pending()を1分に1回しか呼び出さない場合、そのジョブは1分間に1回しか動作しません。

上記のコードは無限ループでschedule.run_pending()を呼び出すようにしています。

  
schedule.every().day.at("10:00").do(job)のような時間指定でジョブを実行させるコードは実行環境の時刻でジョブを開始します。タイムゾーン変換機能はないらしいのでご注意ください。

まとめ

Pythonを定期的に動かすのにバッチを作ってタスクスケジューラに登録するしかないかなぁ、と思っていたのですが、Pythonで楽に書けるライブラリがあったので使ってみました。
手軽にジョブを設定できるので、かなり楽にシステムを動かすことが出来ました。

98
90
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
98
90