concurrency and parallelism
fluent python に言及があった、
concurrency is not parallelism although it enbles parallelism.
うまく concurrencyを構造化して構築することで、IO Bound, CPU Bound に結果として parallelに対応できる。
単純に CPUをparallelに走らせて問題解決する場合もある。
手法が違うというより、焦点のレイヤーが違う? 並列(メタ)で語るべきでないのかも
電池とのアナロジーが効くかなとおもったけど、電池の並列接続は 英語で parallel??
いくつか例を挙げながらよく話題になるconcurrent(並行)とparallel(並列)の違いをn_sodaさんと話し合いました。
concurrentとparallelの違いが掘り下げられて改めて勉強になりました
from @n_soda:そもそもハードウェア屋さんがconcurrentとparallelの違いを気にしているかどうかですね。気にしてない気がします。(常にparallelなので)
そうか。
とりあえず、マルチプロセスなら(CPU,メモリ)を別に用意するので、使う資源を複数用意するので、並列(parallel)
使う資源はそのままだけど、切り替えを上手く?やって、複数のタスクをさばくの並行(concurrent)
リソースを列に並べて流す。
(一つの)おおきなリソースの中で、タスクがそれぞれに行き交って、大元なプロセス(スレッド)がそれを拾い上げる。
以下は、良い情報だと思う。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ざっくりいうと、並行処理では共通のリソース(例えばCPUやメモリ)をやりくりしながら複数のタスクをさばいています。
1つのプロセスの中でのやりくりなので、cpuバウントなときは、並列処理(マルチプロセス)が必要。
ioバウンド、通信待ち?(これもioバウンドになる)な場合は、cpuのリソースを他に回す。メモリバウント?は読み込む量をアプリ側で調整するので、これは分割処理?
api処理などで待ち時間が多いものには、並行処理が有効。Golang は特に、goroutineの起動コストが低い(他の言語でのスレッド生成などより)らしい。 GCP DataFlowで、transformするときの関数名は、 parDo. parallelDoの略なんだろうで、並列処理をする。リソース(instance?) を列分用意する。