3月の市役所に申請が集まる
ある市役所では、転入の届けをネットで受け付けています。届いた申請は、書類チェックの仕組みが1件ずつ確かめます。1分に20件まで処理できます。
3月の最後の週、朝9時には1分に80件の申請が届きます。
申請の画面がチェックの終わりを待っていたら、市民の画面は止まったままです。どうすれば良いでしょうか。
このレッスンのゴール
メモ
キューを使うと2つの部分がそれぞれの速さで働ける理由を説明できる。
今日のキーワード
| ことば | いみ | れい |
|---|---|---|
| キュー | 仕事を順番に待たせる列 | |
| メッセージ | キューに入れる1件の仕事 | 申請 0301 |
| 送り手 | メッセージをキューに入れる部分 | |
| 受け手 | メッセージを取り出して処理する部分 | |
| 滞留数 | キューで待っているメッセージの数 | |
| ワーカー | 受け手として動く1つのプログラム |
学生が入力するセルは、このプレビューでは空白です。
送り手と受け手の間にキューを置く
キューは、仕事を順番に待たせる列です。申請の画面は送り手です。申請をメッセージとしてキューに入れ、市民には「受け付けました」とすぐ返します。
書類チェックは受け手です。キューからいちばん古いメッセージを取り出し、確かめ終わったら次を取り出します。
どちらも、相手の終わりを待ちません。
試す: Pythonでキューを作る
# キューとしてリストを使います。後ろに入れて、前から取り出します。
queue = []
# 申請の画面が3件入れて、市民にはすぐ返事をします
queue.append("申請 0301")
queue.append("申請 0302")
queue.append("申請 0303")
print("待っている数:", len(queue))
# 書類チェックが、いちばん古い1件を取り出します
job = queue.pop(0)
print("チェック中:", job)
print("待っている数:", len(queue))
# 「申請 0304」を入れてから、2件取り出しましょう。
# 最後にキューに残るのは、どの申請ですか。
滞留数は増えて、あとで減る
送り手と受け手は、別々の速さで動きます。届く数が処理できる数より多いと、滞留数が増えます。
昼になって申請が減ると、受け手が追いつきます。滞留数は少しずつ減り、0に戻ります。
待っている間も、メッセージは消えません。市民にはチェックの結果が少し遅れて届くだけです。
例: 朝の5分間の滞留数
| 時刻 | 届いた数 | 処理した数 | 終わりの滞留数 |
|---|---|---|---|
| 9:00 | 80 | 20 | 60 |
| 9:01 | 80 | 20 | 120 |
| 9:02 | 30 | 20 | 130 |
| 9:03 | 10 | 20 | 120 |
| 9:04 | 0 | 20 | 100 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
キューを入れると処理が速くなる、と考える人は多いです。実際は、書類チェックは1分20件のままです。キューは、片方が相手を待たずに済むようにし、急な山を受け止めます。滞留数が毎日増え続けて減らないなら、受け手を増やす必要があります。
ワーカーを増やすと早く減る
受け手のプログラムは、いくつも同時に動かせます。1つ1つをワーカーといいます。ワーカーは、それぞれ別のメッセージを取り出します。
1分20件のワーカーが3つなら、合わせて1分60件です。
ワーカーが止まっても、メッセージはキューに残ります。直して動かし直せば、古い順に続きから処理します。
例: 600件たまったとき
| ワーカーの数 | 1分に処理する数 | 0になるまで |
|---|---|---|
| 1 | 20 | 30分 |
| 2 | 40 | 15分 |
| 3 | 60 | 10分 |
| 5 | 100 | 6分 |
学生が入力するセルは、このプレビューでは空白です。