【Python】Semaphoreの使い方【BoundedSemaphoreとの違いとは?】

【Python】Semaphoreの使い方【BoundedSemaphoreとの違いとは?】

本記事ではPythonのthreadingメソッドであるSemaphoreをメモ程度にまとめています。Pythonは非常に人気なプログラミング言語です。そんなPythonでのSemaphoreの使い方が参考になれば幸いです。

本記事の目標

Semaphoreはスレッドの数を指定することができるメソッドです。
ちなみに、本記事の実行環境は「python 3.8.8」です。

SemaphoreとBoundedSemaphoreの違い

Semaphoreと似たメソッドにBoundedSemaphoreがあります。
Semaphoreはrelease()を忘れると無限ループが行われる可能性があるそうなので、release()がスレッドの数だけなければエラーが返ってくるSemaphoreBoundedを使うほうが一般的らしいです。

BoundedSemaphoreの使い方はSemaphoreと同じです。

Pythonコード

Semaphoreの使い方は下のような感じ。
process1〜process4でスレッドの処理を再現しています。
Semaphore(3)とすることで3つのスレッドで処理が行われています。

# SemaphoreよりBoundedSemaphoreの方が無難
import threading
import time

def process1(semaphore):
    with semaphore:
        print('ー処理1が開始')
        time.sleep(5)  # 処理を再現
        print('ー処理1が終了')

def process2(semaphore):
    with semaphore:
        print('ーー処理2が開始')
        time.sleep(5)  # 処理を再現
        print('ーー処理2が終了')

def process3(semaphore):
    with semaphore:
        print('ーーー処理3が開始')
        time.sleep(5)  # 処理を再現
        print('ーーー処理3が終了')

def process4(semaphore):
    with semaphore:
        print('ーーーー処理4が開始')
        time.sleep(5)  # 処理を再現
        print('ーーーー処理4が終了')

if __name__ == '__main__':
    semaphore = threading.Semaphore(3)

    # スレッドを行うインスタンスの作成
    p1 = threading.Thread(target=process1, args=(semaphore,))
    p2 = threading.Thread(target=process2, args=(semaphore,))
    p3 = threading.Thread(target=process3, args=(semaphore,))
    p4 = threading.Thread(target=process4, args=(semaphore,))

    p1.start()
    p2.start()
    p3.start()
    p4.start()
【実行結果】
ー処理1が開始
ーー処理2が開始
ーーー処理3が開始
ー処理1が終了
ーー処理2が終了
ーーー処理3が終了
ーーーー処理4が開始
ーーーー処理4が終了

実行結果から3つのスレッドで処理が行われていることがよく分かりますね。
詳しいSemaphoreの使い方は公式リファレンスからどうぞ。

ということで本記事はPythonのSemaphoreを用いたスレッド制御方法を紹介しました。
最後まで読んでいただきありがとうございました\(^o^)/

超オススメのPC用品

PCを操作する上で、トラックボールマウスが非常におすすめです!
僕も感動したこのマウスを、騙されたと思って使ってみてください!(^^)

外部モニターで2倍以上の効率化が見込めます!
安いものだと、たったの1万円前後なのでおすすめですよー!\(^o^)/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です