ノンブロッキングとは

ノンブロッキングとはプログラミング処理のことで、「ノンブロッキングI/O」とも呼ばれます。また、I/Oとは「input/output」の略であり、日本語では「入出力」と訳されます。ノンブロッキングI/Oは、I/Oの処理を待たずに関数から反応が返ってくるので、「処理をブロック状態にさせない=ノンブロッキング」ということです。
通常、コンピュータにデータを入力し反応があるまでには時間差が生じます。ほかの処理も行う場合は前の処理が完了するまで待ち時間が生じます。しかし、ノンブロッキングI/Oだと、処理の進捗をチェックしながら同時に複数の処理を並行して行えます。
入力したデータに対して待ち時間がないため、大量のアクセスにも対応可能です。
ブロッキング、非同期との違い
よりノンブロッキングへの理解を深めるために、「ブロッキング」や「非同期」との違いを見ていきましょう。
ブロッキングとの違い:処理前に待ち時間が発生するか
ブロッキング処理は操作に対して順番に処理する流れのことで、「同期処理」とも呼ばれます。操作を順番に処理していくため、操作と操作の間には必ず「待ち時間」が発生します。
しかし、ノンブロッキングの場合は、操作間に待ち時間は発生しません。操作の処理を行いながらほかの処理も同時進行で行える点が特徴です。
非同期との違い:処理完了の通知がくるか
非同期処理とはブロッキング処理と異なり、操作に同期せずに処理を行うことです。ノンブロッキングも同期を行わないため、大きな意味で非同期処理になりますが、通知を返す点で違いがあります。
非同期処理は同期処理と違い、処理が完了すると通知が返ってきます。そのため、通知が返ってくるまでの間であれば、ほかの処理を行えるでしょう。
ノンブロッキングの場合は処理完了の通知はなく、処理が完了していない場合はエラー通知を受け取ることですぐに状況を把握できます。
ノンブロッキング処理をするメリットと問題点
ノンブロッキング処理を行うメリットは複数あります。ノンブロッキング処理を実装すれば1スレッドを多重化することで、複数のリクエストにも対応可能です。また、低速なネットワークであったとしても、処理やCPUの効率が向上します。
しかし、ノンブロッキング処理は良いことばかりではありません。まず実装することが難しく、適切に並行処理を行えるようにするためには、プログラミングの技術が必要です。また、並行処理を行うためのツールも用意しなければなりません。
ほかにも、時間がかかるようなI/O処理を行うと、処理が追いつかずに全体のパフォーマンスが低下する危険性があります。実際に1つの処理を行っている間はほかの処理速度は低下します。
メリットと問題点のバランスをよく考えて実装することが大切です。
ノンブロッキングについて理解し、効率的に開発をしよう
ノンブロッキングは通常のブロッキングと違い、操作の待ち時間がないため高速な処理を実現します。
また、1スレッドで複数のリクエストも処理できるため、アクセスが増えることが予想される場合におすすめです。しかし、ノンブロッキングの実装は難しいだけでなく、重い処理をリクエストすると全体の性能が低下する可能性があるため注意してください。
ノンブロッキングについて適切に理解し、効率的に設計・開発しましょう。