他部署に確認メールを送ったあと、返事が来るまで受信箱を眺めて何もできずにいる。そんな経験はないでしょうか。返事を待つこと自体は避けられませんが、「待っている間、自分の手はどうなっているか」は、実は選ぶことができます。この選び方の違いが、コンピュータの世界でブロッキングとノンブロッキングと呼ばれる考え方です。
ブロッキングとは何か
ブロッキング(処理を呼び出した側が、結果が返るまで動きを止めて待つ方式)とは、依頼を出したプログラムが、その依頼の結果が返ってくるまで、他の一切の作業をせずに待ち続ける仕組みです。前のページで見たI/Oバウンドな処理の典型的な扱い方であり、依頼を出す側の処理は、返事が来るその瞬間まで完全に停止します。
この仕組みは、プログラムの作り方としては単純で分かりやすいという利点があります。「依頼を出す→結果が返る→次の行に進む」という順番がそのままコードの見た目通りに進むため、書く側にとって直感的です。しかし欠点は明白です。依頼の相手が遅ければ遅いほど、依頼を出した側は無駄に停止し続けることになります。1つの依頼を待っている間、他にできる仕事があっても、それに手をつけることができません。
仕事における最も分かりやすいブロッキングの例は、電話です。電話をかけると、相手が出て話が終わるまで、こちらは基本的に他の作業に集中できません。相手の手が空くまで、こちらの時間もまるごと相手に合わせて止まります。これは1対1でその場のやり取りが完結する反面、相手の都合に自分の時間全体を明け渡すことでもあります。緊急で即座に答えが欲しいときには適していますが、そうでない用件にまで電話を使ってしまうと、待ち時間の浪費が積み重なっていきます。
ノンブロッキングとは何か
これに対してノンブロッキング(処理を呼び出した側が、結果を待たずにすぐ次の作業に進む方式)は、依頼を出したら、その場で結果を待たずにすぐ次の処理に移る仕組みです。結果は後から届くので、届いたタイミングで必要な処理を行います。依頼を出した側は、待っている間も他の作業を進められるため、全体として無駄なく時間を使えます。
ただし、ノンブロッキングには単純さとのトレードオフがあります。依頼を出した後、結果がいつ届くか分からない状態で他の作業を並行して進めるには、「結果が届いたらどう扱うか」をあらかじめ決めておく必要があります。この段取りを怠ると、結果が届いたことに気づかない、複数の依頼の結果が混ざって収拾がつかなくなる、といった混乱が起こります。仕事でも、同時にいくつもの依頼を先に出しておくと、どの返事がどの依頼に対応するものかが分からなくなり、かえって整理に手間がかかることがあります。だからこそ、依頼を出す件数が増えるほど、何をいつ誰に頼んだかを一覧で管理しておく必要性も高まります。ブロッキングが「シンプルだが遅い」のに対し、ノンブロッキングは「効率的だが段取りの手間がかかる」という対比になります。
メールやチャットは、この意味でノンブロッキングな道具です。送った時点でこちらの手は空き、返事が来るまでの間に別の作業を進められます。電話とメールのどちらを使うべきかという日常的な判断は、実はブロッキングにするかノンブロッキングにするかという設計判断そのものです。急ぎで即答が必要な用件は電話が向いており、多少時間がかかってもよい用件はメールやチャットの方が全体の時間を無駄にしません。道具の選び方1つにも、この章の考え方は応用できます。
仕事への翻訳 — 依頼を先に出す
仕事において、ブロッキングにあたるのは「依頼を出したあと、その場で返事を待ち、他の作業に手をつけない状態」です。他部署への確認メールを送った直後、受信箱を眺めて待ち続けるのがこれにあたります。ノンブロッキングにあたるのは「依頼だけ先に出しておいて、返事が来るまでの間に別の作業を進める状態」です。
この翻訳から導かれる実務上の指針は単純です。「依頼はできるだけ早く出し、返事を待つ間は他の作業を進める」。当たり前に聞こえるかもしれませんが、実際にこれを徹底できている人は多くありません。多くの場合、依頼を出すタイミング自体が遅く、しかも依頼を出した後もその場で待ってしまい、他人バウンドな時間をまるごと浪費しています。
この翻訳をさらに一歩進めると、「依頼の出し方」自体を見直す視点も出てきます。ブロッキング的な依頼の仕方とは、「返事がないと次に進めない」という前提で用件を伝えることです。ノンブロッキング的な依頼の仕方とは、「返事が来るまでの間、相手にも自分にも身動きが取れる余地を残す」形で用件を伝えることです。たとえば「今すぐ返事をください」という依頼はブロッキング的であり、「今週中に教えてもらえれば大丈夫です」という依頼はノンブロッキング的です。用件の緊急度と、依頼の伝え方を一致させることが、待ち時間の設計の第一歩になります。
依頼を先に出すという行動には、もう1つの利点があります。依頼を出す順番を入れ替えるだけで、複数の待ち時間を重ねられるということです。たとえば、確認事項がA部署とB部署の2件あるとき、A部署への確認を送ってその返事を待ってからB部署へ確認を送るのはブロッキング的なやり方です。両方の確認を先に同時に送っておけば、2つの待ち時間は重なって進み、全体の所要時間は短くなります。これは後のページで扱うパイプライン化にもつながる発想です。
具体場面で見る
問い合わせ対応の場面では、顧客からの質問に答えるために事実確認が必要なとき、確認メールをまず送ってしまい、その返事を待つ間に別の問い合わせに手をつける、というのがノンブロッキングな動き方です。反対に、確認メールを送った後、その返事が来るまで次の問い合わせに一切手をつけないのがブロッキングな動き方です。件数が多い問い合わせ対応ほど、この違いは1日の処理件数に大きく影響します。
会議調整の場面でも同様です。日程候補を関係者全員に送ったら、その場で全員の返信を待つのではなく、次に進めるべき準備作業に移る。これがノンブロッキングな組み立てです。多くの人は無意識にこれを実践していますが、緊急度の高い案件になるほど、待ちきれずに何度もメールを見返してしまい、結果的にブロッキング的な振る舞いに戻ってしまいがちです。
引き継ぎ業務では、前任者への質問事項をリストにしてまとめて送ることが、依頼を先に出すという発想そのものです。1つ確認しては返事を待ち、また1つ確認しては返事を待つ、という進め方はブロッキングの繰り返しであり、引き継ぎ全体の期間を無駄に引き延ばします。疑問点を洗い出す作業自体は頭バウンドな作業なので、先にまとめて済ませてしまい、確認は一括で出す。これだけで引き継ぎ全体のスループット(単位時間あたりに処理できる仕事の量)が変わります。
週次報告の作成でも同じ発想が使えます。他部署の数字が必要だと分かった時点で、報告書の他の部分を書き終える前に依頼だけ先に送ってしまう。これがノンブロッキングな進め方です。反対に、報告書の構成を最初から最後まで書き終えてから、最後になって「そういえば他部署の数字が要る」と気づいて依頼を送るのは、依頼のタイミングそのものが遅く、結果的に締切間際の待ち時間を生み出します。依頼を出すタイミングを早めるだけで、待ち時間の多くは事前に消化できるようになります。
落とし穴 — ノンブロッキングは無秩序ではない
ノンブロッキングという考え方を都合よく解釈すると、「返事を待たずに何でも先に進めればいい」という乱暴な運用になりがちです。しかし、依頼を先に出すことと、依頼の結果を管理せずに放置することはまったく別の話です。ノンブロッキングを機能させるには、「どの依頼をいつ出したか」「その結果がまだ届いていないものは何か」を把握しておく仕組みが欠かせません。この管理を怠ると、依頼を出したこと自体を忘れてしまい、締切間際になって初めて「まだ返事が来ていない」と気づく、という失敗につながります。
もう1つの落とし穴は、本当に急ぎで、相手の返事なしには一歩も進められない依頼まで、ノンブロッキングの発想で後回しにしてしまうことです。すべての依頼を先出しにして並行させればよいわけではなく、依頼の重要度や緊急度に応じて、あえてその場で待つべき場合もあります。この判断は、次章で扱うスケジューリングの考え方とも関わってきます。
さらに見落とされがちなのが、相手から見たブロッキング・ノンブロッキングです。自分は依頼を先に出してノンブロッキングに動いているつもりでも、依頼の受け手からすると、こちらの依頼がその人の作業をブロッキング状態にしてしまっていることがあります。たとえば、返事を急かす一言を添えて依頼を送ると、相手はその依頼を最優先で処理せざるを得なくなり、相手が抱えていた他の作業がすべて止まってしまいます。自分の待ち時間を減らそうとした工夫が、相手の待ち時間を増やしているだけ、ということも珍しくありません。待ち時間の設計は、自分側だけでなく、依頼を受け取る相手側の時間の使い方にも影響することを忘れてはいけません。
依頼を先に出すことは万能の解決策ではなく、「先に出した依頼の結果をどう受け取るか」という段取りとセットで初めて機能します。依頼を出すところまではノンブロッキングにできても、その先の結果の受け取り方をブロッキング的に、つまり何度も画面を確認しにいく形にしてしまうと、時間の浪費は形を変えて残ってしまいます。この受け取り方については、次のページで見るポーリングと割り込みという2つの方式が関わってきます。
ここまでの内容を整理すると、ブロッキングとノンブロッキングの選択は、単に「待つか待たないか」という二択ではなく、「依頼の出し方」「待っている間の過ごし方」「結果の受け取り方」という3つの段階それぞれで問われる選択だと分かります。どこか1つの段階だけをノンブロッキングにしても、他の段階がブロッキングのままなら、全体としての効果は限定的です。3つの段階をまとめて見直すことで、初めて待ち時間の設計は効果を発揮します。
持ち帰り
- ブロッキングは依頼を出してその場で待つ方式、ノンブロッキングは依頼を出してすぐ次に進む方式
- 仕事では「依頼はできるだけ早く出し、待つ間は他の作業を進める」という指針に翻訳できる
- ノンブロッキングは、出した依頼の状態を管理する仕組みとセットでないと機能しない
やってみる
今日中に出すべき確認や依頼を思い浮かべ、返事を待ってから次に取り掛かるのではなく、先にまとめて送ってしまってから他の作業に移ってみてください。送った直後に受信箱を何度も確認したくなる衝動を1回だけ我慢できれば、それだけでノンブロッキングな動き方に近づきます。