python並列処理と並行処理について。
並行/並列って?
聞こえは似てるけど意味が異なります。覚えるのに時間がかかりました。
並行(Concurrent)
高速で仕事を切り替えることで、同時にやってるように見せかける仕組み。ある瞬間だけを切り取ると、やっている仕事は一つだけ。
以下はEffective Python 第2版 ――Pythonプログラムを改良する90項目より引用。
むちゃくちゃ仕事できる人が、一人で複数の仕事をこなしてるイメージ。休みなしで効率よく働けるのは羨ましいです。
並列(Parallel)
同時に複数の仕事をやること。
以下もEffective Pythonより。
並行の場合は一人で仕事をこなしていましたが、並列の場合は複数人で仕事を同時に行うイメージです。仕事の進みが単純に速くなります。
前提として、1つのCPU(というかコア)は一度に一つの処理しかできません。なので並列処理を行う場合、複数のコアが同時に動くことになります。
いろいろな単語
並列処理/並行処理について調べてみると、いろんな単語が出てきます。その意味についてなるべく簡単に書いていこうと思います。
CPUバウンド、I/Oバウンド
CPUバウンドとは、処理の実行時間がCPUの計算速度に左右されるような状態のことを指します。CPUバウンドな処理を行なっている場合、CPUはひっきりなしに計算を行なっているので、遊びの時間がありません。
このCPUバウンドに対し、処理の実行時間がI/Oの速度に起因する場合、その処理をI/Oバウンドな処理といいます。一般的に、ファイルの読み書き、データの検索、ネットワークの待ち時間など、入出力に依存するので、これらはI/Oバウンドな処理と言えます。
I/O処理を行っている間、CPUは働いていないので、CPU的にいうと待ち時間になります。なので、この待ち時間に別の処理をさせることによって、全体の処理時間を短くすることができます。つまり並行処理です。
I/Oバウンドな処理の場合、CPUの待ち時間が発生するので、処理速度を向上させるには並行処理が有効です。
一方、CPUバウンドな処理の場合、CPUの遊びはありません。この場合は並行処理を行なっても処理速度は向上しません。CPUバウンドな処理の時間短縮には、並列処理を行うしかありません。
プロセス
OSが実行中のプログラムのことです。OSからメモリが与えられています。
スレッド
プロセスに含まれるプログラムの実行単位です。プロセスは一つ以上のスレッドを持ちます。
マルチプロセス
複数のプロセスを並行して進めることです。
マルチスレッド
一つのプロセスに複数のスレッドが存在することです。
マルチコア
CPUの中核部分をコアといい、CPUがコアを複数持っていることをマルチコア、またはマルチコアプロセッサといいます。コア数が多いほど性能がよくなります。
並行処理の場合、一つのコアの中で仕事を高速に切り替えて実行します。逆に並列処理を行うには、複数のコアで同時に仕事を行うためにマルチコアである必要があります。
コアが2つの場合デュアルコア、4つの場合クアッドコアといいます。
ref
pic ref
https://devopedia.org/images/article/280/6110.1593611188.png