PROGRAM PYTHON

Pythonスクリプト【スレッドを使おう⑤~Eventオブジェクト】

 

 

PythonのスレッドをEventオブジェクトでブロックしてみよう

前回はスレッドの join()メソッドを使ってスレッドの待ち合わせをしました。
今回はプログラムの動きは前回と同じですが、Eventオブジェクトを使ってスレッドの動きをブロックしてみましょう。

 

イベントとは何か?

ここでいうイベントとは、Pythonのドキュメントを参照すると、以下のように記載されています。

イベントは、あるスレッドがイベントを発信し、他のスレッドはそれを待つという、スレッド間で通信を行うための最も単純なメカニズムの一つです。

イベントを使うと、前回の join()メソッドのように他のスレッドの終了まで待つのではなく、指定したタイミングでスレッドの中断や再開ができます。

 

Eventオブジェクトを作成する

Eventオブジェクトの使い方、以下の通りです。
オプションはありません。

オブジェクト名 = threading.Event()

 

スレッドをブロックする

スレッドをブロックするには、wait()メソッドを使います。
内部フラグの値が true になるまで、スレッドの動きをブロックします。
オプションの timeout を設定すると、明示的にブロックを解除しなくても、指定した時間になるとブロックが解除されます。
timeoutは、秒を表す浮動小数点です。
なお、ブロックするスレッドは、wait()メソッドを使ったスレッド自身です

オブジェクト名.wait(timeout=None)

 

スレッドのブロックを解除する

スレッドのブロックを解除するには、set()メソッドを使います。
set()メソッドを使うことにより、内部フラグが true になり、ブロックされていたスレッドが動き出します。

オブジェクト名.set()

 

スレッドを再度ブロックする

一度 set()メソッドを使ってスレッドのブロックを解除すると、再度 wait()メソッドを使ってもスレッドはブロックされません。
再度スレッドをブロックしたい場合は、clear()メソッドを使って内部フラグを false にする必要があります

オブジェクト名.clear()

 

スレッドをEventオブジェクトでブロックするプログラム

Eventオブジェクトを使ったプログラムは、以下のようになります。
動きは前回のプログラムと同じで、thread1が終了してからthread2が動きます。
wait()メソッドは、自分自身のスレッドをブロックすることに注意してください
当たり前ですが、ブロックの解除は他のスレッドから行います。

プログラムを実行すると、左側の表示が終わるのを待ち、右側の表示が開始されます。

次にclear()メソッドを使って、thread2を一旦動かしたあと、再度停止させてみましょう。

プログラムを実行すると、左側の値が3の時に右側の値が1となり、右側の値が6の時に一旦停止して、左側の処理が終了すると再び右側の値がカウントアップしていきます。

 

-PROGRAM, PYTHON
-,