私はこれをどのように行うのだろうかと思っています。1,000 語のリストを読み込んで、単語ごとにスレッドが作成され、各単語に対して Google 検索を行うとします。ここでの問題は明らかです。私は 1k スレッドを持つことはできません。私はスレッドと同期に非常に慣れていないことを覚えておいてください。したがって、基本的には、より少ないスレッドを使用する方法を考えています。スレッド量を固定数に設定し、スレッドを同期する必要があると思います。GetThread を使用して Apache HttpClient でこれを行い、実行する方法を考えていました。実行中、Webページからデータを取得して文字列に変換し、特定の単語が含まれているかどうかを確認しています。
2 に答える
確かに、必要な数のスレッドを持つことができます。ただし、一般的に、コンピューターの処理コアよりも多くのスレッドを使用することはお勧めしません。一度に 1000 のインターネット セッションを作成すると、ネットワークに影響することを忘れないでください。1 つの Google ページのサイズは約 0.3 メガバイトです。本当に一度に 300 メガバイトのデータをダウンロードするつもりですか?
ところで、
並行性については面白いことがあります。「同期は並行性のようなものだ」と言う人もいます。それは本当ではない。同期は並行性の反対です。並行性とは、多くのことが並行して発生することです。同期とは、私があなたをブロックしているときです。 (ジョシュア・ブロック)
この問題をこのように見ることができるかもしれません。
1000 個の単語があり、単語ごとに検索を実行します。つまり、実行するタスクは 1000 個あり、それらは相互に関連していないため、Wiki の次の定義に従って、この問題の場合は同期の必要はありません。
「コンピュータ サイエンスでは、同期とは、プロセスの同期とデータの同期という、異なるが関連する 2 つの概念のいずれかを指します。プロセスの同期とは、複数のプロセスが特定の時点で結合またはハンドシェイクするという考えを指します。同意するか、特定の一連のアクションにコミットします。データ同期とは、データセットの複数のコピーを相互に一貫して保持する、またはデータの整合性を維持するという考えを指します。」
したがって、この問題では、単語検索を実行する 1000 のプロセスを同期する必要はありません。これらのプロセスは独立して実行でき、力を合わせる必要がないからです。したがって、プロセス同期ではありません。
各検索のデータは他の 999 件の検索から独立しているため、データ同期でもありません。
したがって、ジョシュアが同期は私があなたをブロックしているときであると言ったとき、この場合ブロックする必要はありません.
はい、すべてのタスクを異なるスレッドで同時に実行できます。もちろん、システムには 1000 スレッドを同時に実行するリソースがない場合があります ( read same time )。したがって、プールに特定の数のスレッドがあるプールのような概念が必要です...たとえば、10 個のスレッドがある場合、それらの 10 個は、リストから 10 個の単語に対して 10 個の独立した検索を開始します。それらのいずれかがそのタスクで完了した場合、利用可能な次の単語検索タスクを取り上げ、プロセスが続行されます....