blocking I/Oは操作が終わるまで呼び出し元のスレッドを止めます。non-blocking I/Oはただちに戻り、操作が完了する間にスレッドが別の仕事をできるようにします。 同期と非同期は、同じ考え方をAPIのレベルで表したものです。
仕組み
- blocking / 同期: スレッドはデータが届くまで
read()で待機します。単純ですが、その間ずっとスレッドが遊んでいます。N個の遅いクライアントを処理するにはNスレッドが必要です。 - non-blocking / 非同期: 呼び出しはすぐに戻り、結果はコールバック、promise、またはevent loopの通知を通じて後から届きます。1つのスレッドで数千の接続をさばけます。
text
Blocking: ──[ wait for disk ]── (thread stuck, does nothing)
Non-blocking: ──▶ returns now; event loop notified when ready
