8章非同期I/O

8章を読めば以下の問いに答えられるようになる
  • 並行処理とは何で、どのように役立つか?
  • 並行処理と並列処理の違いは何か?
  • 並行処理ができるタスクは何で、できないタスクは何か?
  • 並行処理にまつわるパラダイムにはどのようなものがあるのか?
  • 並行処理を活用するのはどのようなときか?
  • 並行処理はどのようにプログラムを高速化するのか?

 これまでに紹介してきた高速化手法では、一定時間内に実行できるサイクル数を増やしてきました。しかし、ビッグデータの時代には、コードそのものよりも、データの読み込みがボトルネックになることがあります。このような場合、プログラムはI/Oバウンドと呼ばれます。言い換えれば、入出力の効率によって速度が制限される状態です。

 I/Oは、プログラムの流れにとって大きな負担となりえます。データをファイルから読み込んだり、ネットワークソケットに書き込んだりするたびに、一時停止してカーネルとやりとりし、実際の読み取りを要求し、完了を待つ必要があります。これは、実際の読み取り操作を行うのは、自身のプログラムではなく、カーネルだからです。ハードウェアとのやりとりを管理するのはカーネルですから。メモリが割り当てられるたびに同じような処理がされていることを考えると、I/Oの存在を絶望的に感じるかもしれません。しかし、図1-3を振り返ると、ほとんどのI/O処理は、CPUよりも桁違いに遅いデバイスに対して行われていることがわかります。そのため、カーネルとの通信が高速であっても、カーネルがデバイスから結果を得て返すまでにはかなりの時間を要することになります。

 たとえば、ネットワークソケットへの書き込みにかかる時間は、通常1ミリ秒程度ですが、その間に2.4GHzのコンピュータは240万回の命令を実行できます。さらに悪いことに、この1ミリ秒の間、プログラムの実行は一時停止され、書き込み操作が完了したというシグナルを待たなければなりません。このような停止状態のことを「 ...

Get ハイパフォーマンスPython 第2版 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.