Python スレッドをやってみる(3)

今回もtheading.Threadのコンストラクタに呼び出し可能オブジェクトを渡す形式でスレッドを生成する。スレッドを使った簡単な例をメモしておく。いつか役に立つかもしれない、と思うのは自分だけ。

  • タイマー付きスレッド
  • スレッドが起動する前にキャンセル
  • 一定時間ごとに繰り返し
  • スレッド間でEventオブジェクトを使って同期をとる

タイマー付きスレッド

開始時間を指定してスレッドを起動する。例では5秒後にスレッドを起動して、heloheloを表示する

import threading

def hello():
    print "helohelo"

t=threading.Timer(5,hello)
t.start()

スレッドが起動する前にキャンセル

5秒後にスレッドを起動するようにしておいて、2秒後にcancel()メッソドを呼んで、スレッドをキャンセルする。何もせずに終了する、という無駄な例

import threading
import time

def hello():
    print "helohelo"

t=threading.Timer(5,hello)
t.start()
time.sleep(2)
t.cancel()

一定時間ごとに繰り返し

スレッドがスレッドを起動するようにしておくと、一定時間ごとに繰り返すようにできる。この例では1秒ごとにheloheloをprintする。これは何かに役立つかもしれない

import threading

def hello():
    print "helohelo"
    t=threading.Timer(1,hello)
    t.start()


t=threading.Thread(target=hello)
t.start()

次の例は、helohelo!!と表示するスレッド名をいっしょに表示する。

import threading
import time

def hello():
    print "[%s] helohelo!!" % threading.currentThread().getName()
    t=threading.Timer(1,hello)
    t.start()

if __name__=='__main__':
    t=threading.Thread(target=hello)
    t.start()

スレッド間でEventオブジェクトを使って同期をとる

Eventは信号機のようなもの。内部フラグを管理していて、setメッソドでフラグをセットし、clearメソッドでクリアする、waitメソッドはフラグがセットされるのを待つ。

次の例では、t1スレッドが起動されるが、waitメソッドでEventがセットされていないことがわかり、フラグがセットされるのを待つ。一方、メインスレッドでは10から19までのカウント終えて、setメソッドでフラグをセットする。このとき、t1スレッドはフラグがセットされたことがわかり、0から9までカウントする。

import threading

def counter(e):
    e.wait()
    for i in range(10):
        print i

if __name__=='__main__':
    e=threading.Event()
    t1=threading.Thread(target=counter,args=(e,))
    t1.start()
    for i in range(10,20):
        print i
    e.set()

結果は以下のとおり。t1スレッドは、メインスレッドがフラグをセットするまで、ちゃんと待ってますね。えらいやつです。

10
11
12
13
14
15
16
17
18
19
01
2
3
4
5
6
7
8
9