Python のセマフォ
このガイドでは、セマフォを使用して Python でマルチスレッドを処理する方法を学習します。 スレッドへのアクセスを同期し、制限された量のリソースを使用するにはどうすればよいですか?
セマフォ
同期コントローラはセマフォです。 セマフォは、スレッドの限られた数のリソースへの同期アクセスを提供します。
セマフォは、現在利用可能なリソースの数を表す変数と見なすことができます。
たとえば、セマフォとして機能するショッピング モールの駐車場には、特定のレベルで利用可能な複数のスペースがあります。
セマフォの値は、使用可能なリソースよりも大きいか小さい必要があります。 acquire
と release
の操作はセマフォで接続されています。
セマフォの値は、同期に使用されているリソースの 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 番目のスレッドが acquire
と release
の間のコードにアクセスできることがわかります。
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 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