プログラムは実行される際、プロセスという単位で実行領域がメモリ上に割り当てられ、処理が順次実行されていきます。(逐次処理)
マルチスレッドプログラミングとは、プロセスの中の処理を複数のスレッドに分割することで、片方のスレッドがネットワークの応答待ちなど、計算領域を効率よく使えていない時間にも別の処理を進めることができ、実行速度やプログラム構造の改善をすることができます。(並列処理)
タスクの流れ
1.任意のWebサイトへアクセスするWebクローラーの作製。
2.逐次処理により、複数の異なるWebサイト(10サイト程度)にクローリングを行い、終了までの所要時間を計測。
3.並列処理により、2で対象としたWebサイトにクローリングを行い、終了までの所要時間を計測。
4.横軸を並列処理に用いたスレッド数N(スレッド)、縦軸を処理時間T(秒)としたプロットを作成(Nは15程度)
STEP 1. Webクローラーの作製
適当なpythonのライブラリを用い、URLを引数として対象WebサイトのHTMLを返すWebクローラーを作製します。
クローラー用のライブラリはurllib, requestsなどたくさんの種類がありますので、使いやすいものを選択します。
STEP 2. 逐次処理によるクローリング
10個の異なるWebサイトのURLに対し、STEP 1で作製したクローラーを用いて処理終了までの所要時間を計測します。
Hint: Pythonのlistやtupleなどに対象となる複数のURLを格納し、forループを回します。
STEP 3. 並列処理によるクローリング
STEP 2 で用いたURLに対し、STEP 1で作製したクローラーを用いて処理終了までの所要時間を計測します。
但し、今回は適当なPythonのライブラリを用いて並列処理を行います。使用するスレッド数は4とします。
並列処理用のライブラリにはthreading, joblibなどたくさんの種類がありますので、使いやすいものを選択します。
Hint: 並列処理をするためには、クローラーの入力がどのような形でなければならないか注意しましょう。
STEP 4. スレッド数 vs. 処理時間のグラフの作製
並列処理に使用するスレッド数を変えて(1から15程度まで)、STEP 3を行います。
横軸をスレッド数N、縦軸を所要時間T(秒)とし、グラフにプロットします。
Hint: 各スレッド数に対する結果は、一旦外部に保存しておくと作業がしやすいかもしれません。
CHALLENGE
● マルチスレッド(並列処理)と似たものにマルチプロセス(並行処理)というものがあります。マルチスレッドはCPU(コア)内で複数のスレッドを高速に繰り返しており、厳密な意味で処理が同時に実行されていません。
一方、マルチプロセス(並行処理)はCPU(コア)単位で処理が実行されるため複数の処理を同時に実行させることができます。STEP4のコードをマルチプロセス(並行処理)で実装し、マルチスレッドとの違い、それぞれのメリット、デメリットを考えてください。またプロセスベースの並列処理ページのマネージャーの項目を参考にプロセス間でオブジェクトを共有してください。
● さらなる速度アップのための方法の一つとして、REDISを利用することが挙げられます。
HDDとのデータのやり取りは処理速度が遅いですが、それに比べ、インメモリデータベースであるREDISへのデータアクセスは非常に高速となるからです。
マルチスレッドプログラムでデータを格納していた部分を、REDISへの格納に変更してください。(REDISに格納したデータはbytes型になるので注意しましょう。)
さらに、指定したワードが見つかったURLをREDISとPostgresに格納し、両方から保存されたデータに照会してみてください。