私はPythonで単純なWebクローラーを構築しています。私は〜50kのウェブサイトを通過しなければならないでしょう。私はいくつかのマルチスレッドでプロセスをスピードアップしたいと思います。複数のスレッドのバッチを処理する方法は?
私はスレッドのメタオブジェクトとして、各ウェブサイトを通じてクロールするクローラのクラスを定義しています
Crawler(Thread):
def __init__(self, url, depth, wait):
...
はその後、main関数では、私は、URLの完全なリストから10件のURLのバッチを反復処理し、各URLのクローラオブジェクトを作成します。
for i in range(index, math.ceil(len(urls)/10)):
jobs = []
for url in urls[i * 10:(i + 1) * 10]:
s = Crawler(url)
s.setDaemon(True)
s.start()
jobs.append(s)
for j in jobs:
j.join()
問題は、各バッチについて、すべてのスレッドが終了するまで待つ必要があることです。これは、私が持っているとき、100ページの9つのウェブサイト、10,000ページの1つのウェブサイトしかないと不十分です。9つのウェブサイトは数分で完了しますが、10,000ページの大きなウェブサイトは1時間待たなければなりません。次のバッチに進む前に終了します。
物を最適化するには、10個のクローラスレッドで開始し、クローラスレッドが終了するたびにリストが完了するまで次のURLを含む新しいクローラを作成することをお勧めします。
私は長さが10を下回ったが、それは少しハック聞こえるたびに新しいスレッドを追加し、私は参加する()を取り除くとthreading.enumerate
の長さにわたってwhileループを持っている可能性が考えています。
私はPythonのQueue
を調べていましたが、https://docs.python.org/3/library/queue.htmlの例から判断すると、まだ.join()
に依存していて、キュー内のすべてのスレッドが実行されるのを待つ必要があります。
"イベントリスナー"のようなものをスレッドに追加する方法はありますか?スレッドが終了するとスレッドリストを新しいスレッドで更新できますか?