ブロッキングとノンブロッキングの違いとはなにか?
そもそもノンブロッキングて何?
ノンブロッキングとはnode.jsなどではノンブロッキングI/O とも呼ばれる
何かを処理したり、何かを処理前に、処理待ちが発生する場合、
すぐに関数から何か返答返ってくる処理のこと。I/O (input/outputの略) 入出力という意味
何かしらの情報をinput(入力)して、
処理結果をoutput(出力)する一連の流れをI/Oと呼ぶ。
よく理解できないのでブロッキング処理(同期処理)と、非同期処理を理解する必要がある
ブロッキング(同期処理)との違い
●処理前に待ち時間が発生するか。
ブロッキング処理とはある操作に対して順番に処理する流れのこと、
同期通信とも呼ばれる。操作を順番に処理するため、操作と操作の間に待ち時間が生ずる。
目玉焼きの例に例えると
フライパンを火にかける ↓ 油をひく ↓ 卵を割る ↓ 水を入れる ↓ フタをする ↓ 出来上がる ↓ 皿を用意する ↓ 皿に盛りつける
解説するとフライパンを火にかける間はほかの処理には手を付けないこと
つまりこの例だと上から下まで順番に処理が行く。
非同期処理との違い
● 処理完了の通知が来るか
非同期処理はブロッキング処理と違い、操作に同期しないで、処理を行うことができること。ノンプロッキングも同期をしないため、
非同期処理に含まれるが、通知を返す点で違いがある。
非同期処理は同期処理と違い、処理が完了すると通知が返ってくる、そのために通知が返ってくるまでの間は、ほかの処理を行える。
目玉焼きに例えると
フライパンを火にかける ↓ 油をひく ↓ 卵を割る ↓ 水を入れる ↓ フタをする ↓ 出来上がりの通知が来るまでの間で皿を用意する ↓ 出来上がりの通知が来たら皿に盛りつける
この場合だと、ふたをした後、出来上がりの通知が来るまでの間、皿を用意するという別の処理が実行される。
できあがったかの確認をすることなく、出来上がった通知が来てから皿に盛り付けている。
ノンプロッキングの場合
処理完了の通知はなく、完了を待つことがない、処理が完了していない場合は、
エラー通知を受け取ることで状況を把握できる。
目玉焼きに例えると
フライパンを火にかける ↓ 油をひく ↓ 卵を割る ↓ 水を入れる ↓ フタをする ↓ 数秒毎に卵に火が通っていないかチェックする ↓ 卵に火が通っていなかったので、とりあえず皿を出す ↓ 数秒毎に卵に火が通っていないかチェックする ↓ 出来上がっていたので皿に盛る
違いは非同期処理では目玉焼きに火が通ったかどうかは通知によって知ることができます。
ノンプロッキングでは、処理がすぐにできない場合、エラーが返ってきてブロック状態にさせないという処理を行う。
デメリット
①実装することが難しく、適切に並行処理を行えるようにするためには、
プログラミングの技術が必要。
並行処理を行うためのツールも用意しなければならない点。
②時間がかかるようなI/O処理を行うと、
処理が追いつかずに全体のパフォーマンスが低下する危険性がある。
ほかの処理をしている間は処理速度が低下する
まとめ
ノンプロッキングとはある処理を行っている最中も並行して他の処理が(進められるだけ)進む
ブロッキングとはある処理が完了するまで処理をしない