プログラムが一度に特定の数を超えるファイルをダウンロードしないようにする境界付きセマフォ オブジェクトがあります。各ワーカー スレッドは、ダウンロードの開始時にセマフォを取得し、完了時に解放します。
何もダウンロードされていないときにコードを実行したい別のスレッドがあります。セマフォが完全に利用可能になるまでロックする方法が欲しいです。Pythonでこれを行うにはどうすればよいですか?
ワーカーのプールはこれに対する良い解決策のように思えます。そのため、この質問とその回答を検討してください。ワーカーのプールを作成し、すべてのジョブとclose
プールを送信join
してから、ファイルのダウンロードが完了したときに実行するコードに引き渡す前に、物事が完了するのを待つことができます。
セマフォのカウンター値をのぞき見しないでください。これを行うと、セマフォの抽象化が壊れます。さらに、読み取った値が正しい値ではない場合もあります。これは、読み取った値を実際に使用する前にカウントの値を変更する可能性のある別のスレッドが存在する可能性があるためです (スケジューリング ポリシーによって異なります)。2 - あなたの読み取りはアトミックではありません。したがって、ハッキングはうまくいくかもしれませんが、常にうまくいくとは限りません。
プログラムでカウンター変数を使用することをお勧めします。ただし、このカウンターへのアクセスを同期するように注意する必要があります。
完全に理解できたかどうかわかりませんが、次のコードは機能すると思いますか?
from threading import Semaphore
p = Semaphore(5) #Allow 5 times
p.acquire()
download_file()
...
...
このコードでは、p.acquire() が True を 5 回返した後、呼び出しがブロックされます。あなたの目的にはブロッキングコールで十分ではないでしょうか?