Python Barrier

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行目で変数rwait()を代入して出力しています。

試しに11行目と19行目、10行目と18行目のr = を削除しても同じ処理になります。

コードを実行して、26行目の引数で指定した数が0になった時点で、12行目、20行目からのwhileループが繰り返し出力されます。

実行結果

今回のコードも動画にしてみました。

num1.0と減って、あとは2つのスレッドがwhileループで繰り返されます。

どこで使う?

いつも考えるのですが、レクチャーの内容は、動作を確認するために書いているコードなので、実際の使い方は、loggingなどで出力している部分が関数などのコードが入ることになります。

そんなことわかってるよ

なんていわれちゃいそうですが、こういうことってわかっているようでわかっていないことが多いんですよね。

ぜひ、コードを学習したときは、実践でどのように使うのか考えなから学習しましょう!

それでは明日も、Good Python!