2025/11/02 01:10 A Few Words About Async

ロボ子、今日のITニュースはパフォーマンスの種類についての話じゃ。

パフォーマンスの種類、ですか?具体的にはどのようなものでしょうか、博士。

スループットとレイテンシじゃ。スループットはコードがタスクを完了する速さで、レイテンシは何かが起こるまでの時間のことじゃ。

なるほど。ユーザーインターフェースではタスクを16ms以内に完了する必要がある、というのもレイテンシの話ですね。

そうじゃ。Webサーバーなら1〜2秒以内に応答する必要があるぞ。

記事では、非ブロッキングコードの必要性についても触れられていますね。イベントループが16msの予算内に収まらないと、画面の再描画がブロックされる、と。

その通り!そこで出てくるのが、非ブロッキング、非同期、並行、並列という概念じゃ。

これらの違いを理解するのは重要ですね。非同期は非ブロッキングを保証しない、という点が特に。

そうじゃな。並列は、2つのタスクが同時に実行できるコードのことじゃが、言語やOS、ハードウェアに依存するぞ。

スレッドについても言及されていますね。スレッドは並行性を実現する手段ですが、並列性を実現するとは限らない、と。

スレッドは扱いが難しいからの。スレッドセーフとか、ミューテックスとか、アトミック操作とか、色々考えないといけないし。

PythonやRubyでは、GIL(Global Interpreter Lock) 때문에 スレッドが並列に実行されない、というのも重要なポイントですね。

GILがあるせいで、せっかくスレッドを使ってもCPUをフル活用できないんじゃ。

グリーン スレッドという言葉も出てきました。ユーザーランドで実装されたスレッドで、高速だけど複数のコアを活用できない、と。

プロセスは並列実行が可能じゃが、メモリコストが高いからの。プロセス間の通信(IPC)も複雑じゃし。

チャンク化、Continuation-passing style (CPS)、ジェネレーター/イテレーターといった手法も紹介されていますね。

CPSは関数が結果を返さず、代わりに継続(closure)を引数として受け取るプログラミングスタイルじゃ。非ブロッキングにできるが、コードが読みにくくなるのが難点じゃな。

async/awaitについても触れられています。JavaScriptではPromiseがよく使われますが、async/awaitはジェネレーターのシンタックスシュガーだと。

async/awaitは便利じゃが、関数coloringという問題があるからの。CPUバウンドのコードではパフォーマンスコストがかかることもあるぞ。

Go言語はasync/awaitをサポートしていませんが、透過的なM:Nスケジューラを提供することで並行プログラミングを容易にしているんですね。

Goのgoroutineは、メモリ使用量を気にせずにタスクを起動できるのが強みじゃ。ただ、並行性が暗黙的であるため、コードの推論が難しくなることもあるぞ。

OCamlについても少し触れられていますね。効果を使用して協調的なコンテキストスイッチングを可能にする、と。

結局、どのツールを使うべきか、じゃな。CPU負荷の高いタスクやI/Oを非ブロッキングにするにはスレッドが必要じゃ。セキュリティやサンドボックス化にはプロセスを使うのが良いぞ。

I/Oバウンドのタスクではasync/awaitがCPUを効率的に使用できますね。M:Nスケジューラが利用可能なら活用すべき、と。

そういうことじゃ!しかし、ロボ子よ、これだけ色々あると、どれを選べばいいか迷ってしまうのじゃ。

そうですね。まるで、どのケーキを選べばいいか迷うようなものです。

うむ。全部食べたい気持ちは山々じゃが、お腹を壊してしまうからの。…って、うまいこと言ったつもりだったのに、全然面白くないのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。