アメグラ2号のブログ

1980年代後半の古き良きビデオゲームのほか、オッサンの個人的備忘録

python 並列処理とevent,wait

f:id:game-allergy:20210331143049p:plain

並列処理を作った時にeventとwaitのこともちょっと確認した。

eventとwaitを使えば、自分の好きなところで処理を待機させ、好きなタイミングで実行処理に入ることができる。これは便利だ。

最初は理解不能…かと思ったけど、1つずつ処理を見ていったらそうでもなかった。

基本的な流れが分かるようにここに整理しておこう。

スクリプト

# ===================================
# 【備考】:2つのタスクを並列処理
# 【備考】:eventによる待機処理
# ===================================
from threading import (Event, Thread)
import time

#----------------------------
# 1 eventのインスタンス
event1 = Event()
event2 = Event()

#----------------------------
def func1():
    # 4-2 スレッドにより実行
    print("func1-1 executed")

    # 4-3 待機(イベント発生まで)
    # 5-2 実行(イベント発生後に)
    event1.wait()
    print("func1-2 executed")

def func2():
    # 4-2 スレッドにより実行
    print("func2-1 executed")

    # 4-3 待機(イベント発生まで)
    # 7-2 実行(イベント発生後に)
    event2.wait()
    print("func2-2 executed")

#----------------------------
# 2 スレッドに関数をセット
print("thread1,2 set")
thread1 = Thread(target=func1)
thread2 = Thread(target=func2)

# 3 スレッドを開始
print("thread1,2 start")
thread1.start()
thread2.start()

# 4 ちょっと待機
print("sleep 3sec")
time.sleep(3)

# 5 イベントを発生させる
print("event1set")
event1.set()

# 6 ちょっと待機
print("sleep 3sec")
time.sleep(3)

# 7 イベントを発生させる
print("event2set")
event2.set()

# 8 終了待ち合わせする
thread1.join()
thread2.join()
print("ALL process end")
#----------------------------
input()


最後の8の待ち合わせのjoinだけど、これを入れないとprint("ALL process end")の処理が先に始まってしまい、func2処理がその次になる…という変な順番になる。改めて待ち合わせ処理のjoinは大事だな~と思う。


◆ラズパイの並列処理はこちら

game-allergy.hatenablog.com