Python のセマフォ

Haider Ali 2023年6月21日
Python のセマフォ

このガイドでは、セマフォを使用して Python でマルチスレッドを処理する方法を学習します。 スレッドへのアクセスを同期し、制限された量のリソースを使用するにはどうすればよいですか?

セマフォ

同期コントローラはセマフォです。 セマフォは、スレッドの限られた数のリソースへの同期アクセスを提供します。

セマフォは、現在利用可能なリソースの数を表す変数と見なすことができます。

たとえば、セマフォとして機能するショッピング モールの駐車場には、特定のレベルで利用可能な複数のスペースがあります。

セマフォの値は、使用可能なリソースよりも大きいか小さい必要があります。 acquirerelease の操作はセマフォで接続されています。

セマフォの値は、同期に使用されているリソースの 1つがスレッドによって取得されると減少します。 同期リソースの 1つがスレッドによって解放されると、セマフォの値が増加します。

Python のセマフォ

セマフォの概念の Python の実装は、threading モジュールのクラスを使用します。 Semaphore はこのクラスの名前です。

acquire() および release() 関数は、関数コンストラクターと共に Semaphore クラスに含まれています。

セマフォのカウントが 0 より大きい場合、acquire() 関数を使用してカウントを下げます。 そうでない場合は、カウントが 0 より大きくなるまでブロックします。

セマフォ上にあるスレッドの 1つが、release() 関数を使用して起こされます。これにより、セマフォのカウントも増加します。 それでは、セマフォの構文を理解しましょう。

object_name = threading.Semaphore(count)

Semaphore クラス オブジェクトは、上記の構文の object_name で示されます。

一度にアクセスできるスレッドの数は、Semaphore クラスの count 引数によって指定されます。 このパラメーターのデフォルト値は 1 です。

count パラメータの値は、スレッドが acquire() 関数を使用するたびに 1 ずつ減少します。 count パラメータの値は、スレッドが release() 関数を使用するたびに 1 ずつ増加します。

このステートメントによると、acquire() メソッドを呼び出すたびに、count パラメーターの値が減少します。 ただし、release() 関数を呼び出すと、count パラメータの値が増加します。 次のコードを見てください。

# import threading module
import threading

# creating instance of semaphore
sema = threading.Semaphore(1)


def test():
    # appling semaphore
    print(f"Value Of Semaphore --> {sema._value}")
    sema.acquire()
    print(f"acquired lock --> {threading.current_thread().name}")
    print(f"Value Of Semaphore --> {sema._value}")
    print(f"release lock --> {threading.current_thread().name}")
    sema.release()
    print(f"Value Of Semaphore --> {sema._value}")


# initializing threads
t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t3 = threading.Thread(target=test)
# executing threads
t1.start()
t2.start()
t3.start()

上記のコードのように、count が 1 に設定されている場合、スレッドは同期されます。 上記のコードの出力を見ると、それが最初と 2 番目のスレッドであり、3 番目のスレッドが acquirerelease の間のコードにアクセスできることがわかります。

Value Of Semaphore --> 1
Value Of Semaphore --> 1
acquired lock --> Thread-1 (test)
Value Of Semaphore --> 0
Value Of Semaphore --> 0
release lock --> Thread-1 (test)
Value Of Semaphore --> 1
acquired lock --> Thread-2 (test)
Value Of Semaphore --> 0
release lock --> Thread-2 (test)
Value Of Semaphore --> 1
acquired lock --> Thread-3 (test)
Value Of Semaphore --> 0
release lock --> Thread-3 (test)
Value Of Semaphore --> 1

count の値を 1 から 2 に変更する場合、一度に 2つのスレッドが制限されたコードにアクセスできるようになります。 したがって、出力は異なります。

Value Of Semaphore --> 2
acquired lock --> Thread-1 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 1
release lock --> Thread-1 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 1
acquired lock --> Thread-3 (test)
acquired lock --> Thread-2 (test)
Value Of Semaphore --> 0
Value Of Semaphore --> 0
release lock --> Thread-2 (test)
release lock --> Thread-3 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 2

セマフォがスレッドを解放するのにかかる時間は、デバイスの速度に基づいており、毎回異なることに注意してください。 セマフォのインスタンスで count の値を変更することで、上記のコードをテストできます。

著者: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn