Python学習【365日チャレンジ!】217日目のマスターU(@Udemy11)です。
そろそろメッキが釣れるかなと思って、メッキポイントにでかけていったところ、マリンジェットが右へ左へ飛び交っていたので、どうやら魚もどこかに避難していたようです。
全く反応がないので、移動してみても、近場なので、やっぱりそこでもマリンジェット。
潔くあきらめて帰ってきました。
やっぱり釣りは夜にいかないとだめですね。
それでは、今日もPython学習をはじめましょう。
昨日の復習
昨日は、コンディションついて学習しました。
condition
は、event
と同じように、一つのスレッドの処理が終了してから他のスレッドの処理をさせることができましたが、event
とちがうところは、残りのスレッドが並列処理されるか、lock
したように一つづつ処理されるかです。
event
の場合は、並列処理されましたが、condition
は、lock
のときのように、一つづつ処理されます。
コンディションについては、昨日の記事をごらんください。
今日は、バリアについて学習します。
Barrier
バリアというと、ワンピースのバリバリの実の能力者バルトロメオを思い出します。
バルトロメオは、どんな強力な攻撃も跳ね返すバリアを生み出すことができる能力で、ルフィーを崇拝する海賊です。
という話はここまでにして、Pythonのバリアについてのコードを書いていきましょう。
import logging
import threading
import time
logging.basicConfig(
level=logging.DEBUG, format='%(threadName)s: %(message)s'
)
def thread1(barrier):
r = barrier.wait()
logging.debug('num={}'.format(r))
while True:
logging.debug('start1')
time.sleep(2)
logging.debug('end1')
def thread2(barrier):
r = barrier.wait()
logging.debug('num={}'.format(r))
while True:
logging.debug('start2')
time.sleep(2)
logging.debug('end2')
if __name__ == '__main__':
barrier = threading.Barrier(2)
t1 = threading.Thread(target=thread1, args=(barrier, ))
t2 = threading.Thread(target=thread2, args=(barrier, ))
t1.start()
t2.start()
6行目まではこれまでと同じです。
26行目でこれまでと同じように、barrier
オブジェクトを作成して2つのスレッドを作っています。
threading.Barrier(2)
で、引数2
は、10行目と18行目にあるwait()
の数です。
実行コード中にwait()
が出てくるたびに、定義した数から1
少なくなるのですが、この数が0になった時点で次の処理に入ります。
この数が0
より大きい間は、バリアを張ってwait()
以外の他の処理をブロックするようなイメージですね。
普通は11行目と19行目の出力は不要ですが、バリアの数がわかりやすいように10行目と18行目で変数r
にwait()
を代入して出力しています。
試しに11行目と19行目、10行目と18行目のr =
を削除しても同じ処理になります。
コードを実行して、26行目の引数で指定した数が0
になった時点で、12行目、20行目からのwhile
ループが繰り返し出力されます。
実行結果
今回のコードも動画にしてみました。
num
が1.0
と減って、あとは2つのスレッドがwhile
ループで繰り返されます。
どこで使う?
いつも考えるのですが、レクチャーの内容は、動作を確認するために書いているコードなので、実際の使い方は、logging
などで出力している部分が関数などのコードが入ることになります。
そんなことわかってるよ
なんていわれちゃいそうですが、こういうことってわかっているようでわかっていないことが多いんですよね。
ぜひ、コードを学習したときは、実践でどのように使うのか考えなから学習しましょう!
それでは明日も、Good Python!