基本形
threading.Threadクラスで実行する関数と引数を指定し、start()
メソッドで開始させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import threading def func(name): for i in range(10): print(name + ':' + str(i)) ta = threading.Thread(target=func, args=('A')) tb = threading.Thread(target=func, args=('B')) ta.start() tb.start() # 実行結果 # A:0 # B:0 # A:1 # B:1 # B:2 # A:2 # B:3 # A:3 # B:4 # A:4 # B:5 # B:6 # A:5 # B:7 # B:8 # A:6 # B:9 # A:7 # A:8 # A:9 |
同期
幾つかのスレッドの終了を待ってから後続のスレッドを実行させたい場合、join()
メソッドで同期をとりたいスレッドの終了を待機する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import threading def func(name): for i in range(3): print(name + ':' + str(i)) t1a = threading.Thread(target=func, args=['t1a']) t1b = threading.Thread(target=func, args=['t1b']) t2 = threading.Thread(target=func, args=['t2']) t1a.start() t1b.start() t1a.join() t1b.join() t2.start() # 実行結果 # t1a:0 # t1b:0 # t1a:1 # t1b:1 # t1b:2 # t1a:2 # t2:0 # t2:1 # t2:2 |
スレッドクラス
スレッドクラスを継承したカスタムクラスでの実装方法。
- thread.Threadクラスを継承する
- コンストラクタでThreadクラスのコンストラクタを呼び、必要なプロパティをセット
run()
メソッドをオーバーライドし、処理内容を記述- カスタムクラスのインスタンスでstart()を実行
start()メソッドを実行すると、親のThreadクラスのstart()メソッドが呼び出され、そこでrun()メソッドが呼ばれ、カスタムクラスでオーバーライドしたrun()メソッドが実行される。run()メソッドを直接実行すると、シングルスレッドとして実行される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class MyThread(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name def run(self): for i in range(5): print(self.name + ':' + str(i)) ta = MyThread('A') tb = MyThread('B') ta.start() tb.start() # 実行結果 # A:0 # A:1 # A:2 # B:0 # A:3 # B:1 # B:2 # A:4 # B:3 # B:4 |
スレッドの停止
スレッド停止の機能は、thread.Threadクラスを継承したカスタムクラスで実装する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import threading import time class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.counter = 0 self.is_running = True def run(self): while self.is_running: print(self.counter) self.counter += 1 time.sleep(1) def stop(self): self.is_running = False t =MyThread() t.start() time.sleep(5) t.stop() # 約5秒後にスレッドが停止 |