非同期な処理って種類があることに気が付いた話
ついさっきふと
$ \Huge{あ!} $
と気が付てしまったのでメモ。
経緯
Unity Job Systemって何なの?
だってUnityの.Netアップデートされてawait/async使えるようになったじゃん?
って考えてふと
あ、この二つって用途ちょっと違うんだ…
となりました。
というわけで実は二種類あった非同期な処理のタイプがあったんだなーという話
疑似コードはだいたいC#
処理待機(所謂非同期処理)タイプ( 通信や重い処理を別スレッドに移す )
async/awaitは多分主にこのタイプ
裏で重たい処理を別スレッドに放り投げてUIスレッドやメインスレッドでは進行状況を表示するような手法。
勿論重たい処理が同時に何本も走る可能性はある。
コードのイメージとしてはこんな感じ。
//この重い処理が別スレッドになるのでUIが固まらない!
var response = await client.GetAsync(uri);
var text = await response.Content.ReadAsStringAsync();
MessageBox.Show(text);
並列処理タイプ( 行列の計算などの同じ計算を複数のプロセッサで行う )
Unity Job Systemはこちら側だったHPC(High Performance Computing)とか呼ばれるやつもこっち
スパコンとかもこれが用途
100万回しなければいけない計算を10のプロセッサでやれば10万回の時間で終わるよねという方法論
コードのイメージとしてはこんな感じ
//めちゃくちゃ多い要素の掛け算を複数プロセッサで回せばきっと早い!
var array1 = (100万個のint配列);
var array2 = (100万個のint配列);
var result = (100万個のint配列);
//ここは複数プロセッサがいい感じに分担作業してくれる
Parallel.For(0,1000000, i =>{
result[i] = array1[i] * array2[i];
});
結論
実は非同期処理って二つあるのねって話。
後者は非同期処理って言わないのかもしれないけど非同期といえば非同期
実は僕は大学で少し並列処理をかじりました。
そのあとくらいにawait/asyncの勉強をしては?これでどうやって"並列処理"するの?
と思ってました。
でようやく理解して今度は"非同期処理"の方のasync/awaitに慣れたころにJobSystemきたもんだから…
お前何者や…と思って調べてみたら
ああ、実は二つは違ったんだ!と気が付きました。
というわけで、混同している人地味にいそうだなと思ってパッと書いてみました。