さきほど別のブログ記事を書いていて(それはまたそのうち発射するけど)、その中でブロッキング処理とか同期的に扱う、という言葉を使った。
このときの自分の理解がこれ:
- ブロッキング
- 呼ぶと待たされる
- ノンブロッキング
- 呼んでも待たされない、すぐ返る
そのときはJavascriptの話をしていた。Javascriptはシングルスレッドの言語だ。そして、各種のAPIは基本的にノンブロッキングに設計されている。つまり、コールバックを取るようになっていたり、Promise
を返すようになっているということだ。だから、処理系が提供する特殊な処理(例えばNodeが提供するhogehogeSync()
といったもの)を利用しない限り、ブロックが原理的に起こらないし、あえてする理由もない。
という話を書いていて、でも重い計算処理は待たされるだろと思った。これはブロックしていることに他ならないのではないか、と。
しかしこれは自分がブロッキングという概念をちゃんと理解していないだけだと思う! これまで自分はブロッキングという言葉を「実行すると待たされる」という意味で雑に使っていたけれど、たぶんこれは「実行するとCPUにとって待たされる」なのではないか。だから単純に重たい処理はCPUが暇になっているわけではないから「ブロッキングする処理」ではないのだ。
そう考えるとかなりブロッキング=ノンブロッキングに対するとらえかたが変化した。
- ブロッキング
- 呼ぶとCPUが暇になる
- ノンブロッキング
- 呼んでもCPUを暇させない
賢者の知見
ブロッキングってそもそも何だよ - Lambdaカクテル https://t.co/QSpRKqIBcC
— Kory (@Kory__3) 2024年8月3日
スレッドのブロッキングと非同期ランタイムのスケジューリングの話をちょうどこないだしていたので便乗して放流しておこう
この辺は体系的に勉強したわけじゃないんでなんか誤ってたら教えてください pic.twitter.com/25D4DPShBf