Goでの並列処理について調べていたらConcurrencyというキーワードが出て来たのでなんぞと思って調べてみました。
Concurrencyとは
- 「同時性」という意味。「並行性」とも呼ばれる
- 複数のタスクを同時に実行している状態
- 一つのタスクが完了してから次のタスクを始めるわけではなく、複数のタスクがそれぞれ実行中の状態になる
- アプリケーションを高速化するための仕組み・プログラムのデザイン
- Parallelism(並列性)は言葉は似ているが、プログラムというよりランタイムの性質で、「複数のCPUを使っている状態」を指す。「並行かつ並列」な状態や「並行だけど並列じゃない状態」は両方ありえる
ConcurrencyとParallelismの違い
Difference between Concurrency and Parallelism
Concurrencyで速くなる仕組み
一つのCPUしか使わないんだったらいくらタスクを切り刻んで順番入れ替えてもトータルの速さは変わらないんじゃ?と考える人もいるかも知れませんが、「I/OなどCPUを使わないけど時間がかかる処理をしているタスクは他のタスクにCPUを譲り、CPUの待ち時間を減らすことで、結果的に全部のタスクが終わる時間が速くなる」ということのようです。
コンロが一個しかない料理屋みたいな感じです。(自分の料理を作り終わってから他の人にコンロを渡すのではなく、コンロを使ってないときは他の人に使わせる)
↓Concurrentじゃないプログラムで複数のタスクを実行した場合(CPUの待ち時間が発生する)
画像引用元: https://realpython.com/python-concurrency/#what-is-concurrency
Concurrentなプログラムのデメリット
一見画期的に見えますが、以下のようなデメリットがあり、闇雲に導入すればいいというわけではないようです。
- 複雑さが増す
- 工数がかかる
- Concurrencyをキープするための仕組み(semaphore、mutex、lockなど)の初期化と終了にかかる時間、デッドロックやリソーススタベーションを防ぐための処理が追加されるので場合によっては遅くなる
Concurrencyのオーバーヘッドについての記事
Is Concurrency Really Increase the Performance?