私はPythonで書かれた非常に基本的なマルチスレッドのWebクローラーを作成しており、次のように、ページをクロールしてURLを抽出する関数にWhileループを使用しています。
def crawl():
while True:
try:
p = Page(pool.get(True, 10))
except Queue.Empty:
continue
# then extract urls from a page and put new urls into the queue
(完全なソースコードは別の質問にあります:マルチスレッドのPython Webクローラーがスタックしました)
ここで理想的には、Whileループに条件を追加して、次の場合にwhileループを終了させます。
プール(URLを格納するQueueオブジェクト)は空であり、;
すべてのスレッドがブロックされ、キューからURLを取得するのを待機しています(つまり、新しいURLをプールに入れているスレッドがないため、待機し続けることは意味がなく、プログラムがスタックします)。
たとえば、次のようになります。
#thread-1.attr == 1 means the thread-1 is blocking. 0 means not blocking
while not (pool.empty() and (thread-1.attr == 1 and thread-2.attr == 1 and ...)):
#do the crawl stuff
ですから、他のアクティブなスレッドが何をしているのか、または他のアクティブなスレッドの属性のステータスや値をチェックするためのスレッドがないのではないかと思います。
threading.Event()の公式ドキュメントを読みましたが、それでも理解できません。
ここの誰かが私に道を教えてくれることを願っています:)
どうもありがとうございます!
マーカス