Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ブロッキングってそもそも何だよ

さきほど別のブログ記事を書いていて(それはまたそのうち発射するけど)、その中でブロッキング処理とか同期的に扱う、という言葉を使った。

このときの自分の理解がこれ:

  • ブロッキング
    • 呼ぶと待たされる
  • ノンブロッキング
    • 呼んでも待たされない、すぐ返る

そのときはJavascriptの話をしていた。Javascriptはシングルスレッドの言語だ。そして、各種のAPIは基本的にノンブロッキングに設計されている。つまり、コールバックを取るようになっていたり、Promiseを返すようになっているということだ。だから、処理系が提供する特殊な処理(例えばNodeが提供するhogehogeSync()といったもの)を利用しない限り、ブロックが原理的に起こらないし、あえてする理由もない。

という話を書いていて、でも重い計算処理は待たされるだろと思った。これはブロックしていることに他ならないのではないか、と。

しかしこれは自分がブロッキングという概念をちゃんと理解していないだけだと思う! これまで自分はブロッキングという言葉を「実行すると待たされる」という意味で雑に使っていたけれど、たぶんこれは「実行するとCPUにとって待たされる」なのではないか。だから単純に重たい処理はCPUが暇になっているわけではないから「ブロッキングする処理」ではないのだ。

そう考えるとかなりブロッキング=ノンブロッキングに対するとらえかたが変化した。

  • ブロッキング
    • 呼ぶとCPUが暇になる
  • ノンブロッキング
    • 呼んでもCPUを暇させない

賢者の知見

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?