6

プログラムが一度に特定の数を超えるファイルをダウンロードしないようにする境界付きセマフォ オブジェクトがあります。各ワーカー スレッドは、ダウンロードの開始時にセマフォを取得し、完了時に解放します。

何もダウンロードされていないときにコードを実行したい別のスレッドがあります。セマフォが完全に利用可能になるまでロックする方法が欲しいです。Pythonでこれを行うにはどうすればよいですか?

4

3 に答える 3

3

ワーカーのプールはこれに対する良い解決策のように思えます。そのため、この質問とその回答を検討してください。ワーカーのプールを作成し、すべてのジョブとcloseプールを送信joinしてから、ファイルのダウンロードが完了したときに実行するコードに引き渡す前に、物事が完了するのを待つことができます。

于 2012-07-11T19:17:17.963 に答える
1

セマフォのカウンター値をのぞき見しないでください。これを行うと、セマフォの抽象化が壊れます。さらに、読み取った値が正しい値ではない場合もあります。これは、読み取った値を実際に使用する前にカウントの値を変更する可能性のある別のスレッドが存在する可能性があるためです (スケジューリング ポリシーによって異なります)。2 - あなたの読み取りはアトミックではありません。したがって、ハッキングはうまくいくかもしれませんが、常にうまくいくとは限りません。

プログラムでカウンター変数を使用することをお勧めします。ただし、このカウンターへのアクセスを同期するように注意する必要があります。

于 2012-09-26T11:27:52.723 に答える
0

完全に理解できたかどうかわかりませんが、次のコードは機能すると思いますか?

from threading import Semaphore
p = Semaphore(5) #Allow 5 times
p.acquire()
download_file()
...
...

このコードでは、p.acquire() が True を 5 回返した後、呼び出しがブロックされます。あなたの目的にはブロッキングコールで十分ではないでしょうか?

于 2012-07-11T19:16:30.077 に答える