Python threading.Timerの使い方

Python学習【365日チャレンジ!】208日目のマスターU(@Udemy11)です。

最近、多様性という言葉をよく耳にしますが、個性的な人を見かける機会が多くなりました。
ほんと世の中にはいろいろな人がいます。

もちろん、私自身も他の人から見るとかなり個性的な印象を受けるのかもしれませんが、十人十色とはよくいったものです。

いろいろな人がいて、いろいろな役割を担っていて、世の中が成り立っているということを理解すれば、違った視点で物事を見ることができるようになるので、人生に行き詰まっていると感じているのなら、一度周りをじっくりと観察してみるとおもしろいかもしれません。

それでは、今日もPython学習をはじめましょう。

昨日の復習

昨日は、生存中のスレッドについて学習しました。

forループを使っていくつかのスレッドを生成して並列処理を取り扱いました。

空のリストを定義してスレッドを代入する方法とtherading.enumerateを使って生存中のスレッドを返す方法がありましたが、therading.enumerateを使うと、joinすることができないカレントスレッドも一緒に返してしまうので、カレントスレッドは除外する必要がありました。

いろいろと試してみて理解できることがたくさんありました。

詳細については、こちらの記事を参考にしてください。

今日は、Timerオブジェクトについて学習します。

threading.Timer

Timerはその名のとおり、タイマーです。

タイマーをセットして、start()を呼び出すことでタイマーが動き出し、指定した時間が経過したら、指定したファンクションを実行します。

import logging
import threading
import time


logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s')


def thread():
   logging.debug('start')
   time.sleep(2)
   logging.debug('finish')

if __name__ == '__main__':
   t = threading.Timer(3, thread)
   t.start()

15行目のTimerで時間を3秒、ファンクションをthreadに指定しています。

16行目のt.start()でタイマーがスタートして3秒後にthread()が実行されます。

実行結果

Thread-1: start
Thread-1: finish

3秒間は、何も表示されずに、1行目が表示されたあと、2秒後に2行目が出力されてプログラムが終了します。

Timerの引数

公式ドキュメントを見るとわかりますが、Timerの引数には、intervalfunctionargskwargsがあります。

先ほどのコードでは、intervalfunctionを指定しましたが、【スレッドに渡す引数】で学習した内容と同じように関数に引数xyを指定して値を渡すこともできます。

def thread(x, y=0):
   logging.debug('start')
   logging.debug(x)
   logging.debug(y)
   logging.debug(x * y)

if __name__ == '__main__':
   t = threading.Timer(1, thread, args=(10, ), kwargs={'y': 200})
   t.start()

9行目以降をこのコードに変更しています。

thread関数に引数を指定して、logging.debugでいろいろと出力しています。

実行結果

Thread-1: start
Thread-1: 10
Thread-1: 200
Thread-1: 2000

kwargsは辞書型ですが、数字を入れる場合なら、16行目のargs=(10, )args=(10, 200)にしてkwargs={'y': 200}を無くしても、kwargs={'y': 200}kwargs={'x': 10, 'y': 200}にしてargs=(10, )をなくしても同じ結果が得られます。

Timerの使い道

Timerの使い道はどんな場面があるだろうかと考えてみました。

複雑なプログラムがあって並行処理をさせると負荷がかかるので、少し待ってから処理をさせたいとか、終了したスレッドの値を取得するために実行時間を遅ら
せるという感じでしょうか?

同じ時間を司るtimeモジュールと同じような感じで、こんがらがりそうですが、処理を後回しにしたいときに使うようなイメージだと思うので、具体的な利用シ
ーンが出てきたときに使えるつかえるようにしておこうと思います。

それでは、明日もGood Python!