「今日はやたら更新するね」
「昨日で、さる祭りが事実上終わったのでね」
「猿の祭りか」
「ちがーう」
「じゃあ、何の祭りかは質問しないよ」
「ともかく溜まったものを吐き出しているようなものだ」
「ふーん。それで非同期がどうしたって?」
「我々はなぜ非同期プログラミングを行う必要があるのか」
「それは重要なこと?」
「そうだな」
なぜ非同期化・ストアアプリ編 §
「非同期は、Windowsストアアプリと切っても切り離せない」
「なんで?」
「消費電力を低減できるからだと言われている」
「スマホ、タブレットのバッテリはすぐ上がるって問題への対策だね」
「そうだけど、結局日本じゃみんなWindows系のスマホ、タブレットを使ってないからあまり意味が無い」
「ぎゃふん」
「まあ、そのあたりの呪詛の言葉は、もし呪詛に意味があるならキャリアの幹部を全員呪い殺せるぐらい語ったのでもう繰り返さないよ」
「それで本題はなんだい?」
「ACで駆動されるマシンで非同期って意味があるのかだ」
「システムが軽くなるんだろう?」
「そうそう」
「じゃあ、それでいいじゃないか。カタログスペックでは高速になるはずなのに、なんだかんだでマシンが遅く重くなってる。軽くなるならそれでいいじゃないか」
「いやもっと具体的に」
「具体的になんだい?」
なぜ非同期・サーバ編 §
「結局さ、C10k 問題って言葉もあるわけだが、1つのサーバが膨大な数のクライアントの接続をさばく時代が来たわけだ」
「C10k 問題ってなに?」
「1台のサーバにクライアント1万台接続したいなってことだ」
「1台のサーバにそれだけの能力は無いだろう」
「もちろん、1万接続の全てがCPUパワーを消費したらとても足りないが、接続を維持したいだけなら可能かも知れない」
「ああ、なるほど。たまに通知が流れる程度ならそれでもいいわけだね」
「そうだ。クライアントが増えていくと最初に枯渇するのがポート番号ってことだが、これはWinSockで解決するらしい」
「物理的な接続を維持しなくても論理的な接続は維持されるから、ポート番号は消費しないわけだね」
「では次に問題になるリソースは何か」
「なんだい?」
「スレッドらしいぞ。1接続当たり1スレッドを割り当てると膨大な数のスレッドが要求される」
「それは解決可能なのかい?」
「node.jsのようなスレッドを使わない方法論があるようだが、それはいつか来た道だ」
いつか来た道 §
「なんで?」
「つまりさ。無策で挑むと、時間が掛かる処理が1つあると、そこで全体の処理が止まってしまう。16bit時代のWindowsのアーキテクチャそものさ」
「だからいつか来た道か」
「そうだ。これを解決するには、非同期I/Oを使って処理をブロックされないようにする」
「あれ、ここで非同期が出てくるの?」
「そうだ。出てくる。node.jsあたりは非同期を強制して解決しているらしい」
「じゃあ、node.jsを使えば万事解決するわけ?」
「まさか。今更非効率的なJavaScriptで書けるか」
「えーっ!」
やっぱり §
「やっぱりC#で書きたいよな」
「なんで?」
「開発効率が歴然と違うから」
「慣れじゃ無いの?」
「それで済むならとっくにJavaScriptに身体を慣らしておるわい」
「じゃあどうするんだよ。C10k問題は棚上げかい?」
「いや。だからC#で非同期処理が避けられないってことだよ」
「えっ? なんで?」
「TaskってThreadよりも軽量なんだ。待機中はOSのスレッドをシステムに返却して軽量さを維持できるらしい」
「じゃあ、Taskクラスを活用して非同期プログラミングを心がけると、C10K問題への対策になるわけ?」
「どこまで対策になるかは知らないよ。ただ、その辺がサーバ側で非同期を使う強烈な理由付けになるのかなと思っただけだ」
「アイデアのメモかよ」
「結局、ただ単にイベントを待ってるだけのTaskはほとんど資源を消費しないからな」
クライアントは? §
「ってことは、常に1セッションしか張らないクライアント側ではあまり非同期に意味が無いってこと?」
「意味はあるだろう。バッテリ対策になるらしい」
「じゃあ、ACで使うデスクトップなら?」
「まあ、1セッションぐらいでガタガタ言わなくても良いかも知れない」
「でも、多数の接続を処理するサーバだと非同期APIを使うメリットが出てくるわけだね?」
「そうかもね」
「じゃあ、node.js使わなくてもC#で行けるの?」
「たぶんそうだろう。その辺はおそらくC#の世界もnode.jsの長所を取り入れて弱点を補強していると考えたい」
「TypeScriptでnode.jsってシナリオはあり得ないの?」
「TypeScriptでソース書いてnode.jsのエンジンで動かしたことはあるけど、結局コンパイル結果のJavaScriptファイルを動かしただけで、取り立てて良いこともあまり無いな。C#プログラマがあえて行う必然性をあまり感じられなかった。JavaScriptしか使えないならやってもいいかもしれない」
「なんだ、それじゃつまんないよ」
「あらゆる問題を解決してくれる素敵な万能解は存在しないってことだ」
「そういう解決策があると言う主張は詐欺師を疑えってことだね」
「永久機関と同じ。詐欺の定番」
「じゃあ、C#は違うの?」
「C#への評価はあくまで万能解ではなく比較優位。弱点を認めた上で、総合評価で他の
技術よりも良好だっただけ。だから理論的にはもっと良いものがあっても不思議ではない。あると主張したい奴はそうおいらに言えば良い。ただし、こちらが行った評価の結果を覆すだけの根拠は持って来いよ」
「それ、耳タコだよ」
「言ってくる奴がいないのでね。待ってるのだけど」