2017-06-27 34 views
-3

私はわずか数週間前にPythonでプログラミングを始めました。私はJavaにいくつかの経験がありますので、セットアップするのが難しくありませんでした。Pythonでのマルチスレッド/マルチプロセッシング中に重複した結果を避けるには?

今、私はURLLibを使用してサイトリストのソースコードをスクラップするプログラムを持っています。

私は何千ものサイトを掻き集めるので、私は明らかにそれをマルチスレッドまたはマルチプロセスにしたいと思っています(私は実際にその違いを知らない)。

良いことは、私のマルチスレッドが機能することです!しかし、私のスレッドのすべてがまったく同じサイトを擦っているので、私には基本的に無意味です。

どうすればこの問題を回避できますか?事前に助けてくれてありがとう:)

+3

サンプルコードがないと、手助けが困難になります。問題を示す[最小限の、完全な検証可能な例(https://stackoverflow.com/help/mcve)]を入力してください。 –

+0

一般的なプリンシパルとして、私はあなたのスレッドが重複なしでキューから作業するアイテムを引き出すことができる 'queue'モジュールを見ることをお勧めします –

+0

私は単に私のコードを提供していませんでした。私の特定の問題に。 お返事ありがとうございます。待ち行列を見て、私の問題を解決しました!私はそれが今どのように動作するかを見ます。 –

答えて

0

グローバルインタープリタロックはスレッドがインタプリタでコードを同時に実行できないため、マルチスレッドとマルチプロセッシングの違いはPythonでは重要です。 Webスクレイピングの目的では、スレッドがWebリクエストのみを実行する(スレッドが待機中にブロックするように)限り、スレッドを使用することは問題ありません。応答の処理を並行して実行したい場合は、multiprocessingを使用して各サブプロセスに独自のインタプリタを持たせ、CPUコアを活用できるようにすることをお勧めします。

重複の問題に関しては、サイトのリストをスレッドまたはサブプロセスに配布する方法にバグが存在する可能性があります。 multiprocessingにはQueueがあり、これはプロセスセーフです(スレッドセーフでもあります)。これは、2つのサブプロセスが同時にキューからgetにしようとすると、同じサブプロセスの代わりにキューから順次アイテムが与えられることを意味します。

要約すると、各サイトはQueueのメインスレッドからput、次に各ワーカースレッドまたはサブプロセスからはgetになるはずです。

関連する問題