仕事をチャンクに切って、別々のプロセスに任せる
プロセスとは、実行中のプログラム1つ分のことで、それぞれが自分のメモリを持ちます。仕事をいくつかのかたまり(チャンク)に切り、別々のプロセスに任せると、同時に進められます。
このレッスンでは、切り方と、結果のまとめ方を学びます。ラボにGPUはなく、ふつうのPythonのプロセスで確かめます。
このレッスンのゴール
メモ
仕事をチャンクに切って、部分和を出し、まとめて全体の答えにできる。
重要な言葉
| ことば | いみ |
|---|---|
| プロセス | 実行中のプログラム。自分のメモリを持つ |
| スレッド | 1つのプロセスの中で動く、小さな流れ |
| チャンク | 仕事を切り分けた、1つのかたまり |
| 部分和 | 1つのチャンクの合計 |
| マージ | 部分の結果を、1つの答えにまとめること |
学生が入力するセルは、このプレビューでは空白です。
仕事は、チャンクに切れば分担できる
1から40を足す仕事を、4人で分けるとします。10個ずつの4つのチャンクに切れば、各自が自分の部分和を出せます。
部分和は、55、155、255、355です。最後に4つを足すと820で、1人で全部を足した答えと同じです。
チャンクに切って部分和を出す
# 1から40までを、10個ずつのチャンクに切って、部分和を出します。
data = list(range(1, 41))
size = 10
partials = []
start = 0
while start < len(data):
chunk = data[start:start + size]
partials.append(sum(chunk))
start = start + size
print("部分和:", partials)
print("まとめた合計:", sum(partials))
# size を 5 に変えて、部分和の数と合計を見ましょう。
プロセスはメモリを分け、スレッドは共有する
プロセスは、それぞれが自分のメモリを持ちます。スレッドは、同じプロセスのメモリを共有します。
Pythonの標準の実装には、同時にPythonの命令を進められるスレッドは1つだけ、という制限があります。計算を同時に進めたいときは、プロセスを使います。
プロセスとスレッドの違い
| プロセス | スレッド | |
|---|---|---|
| メモリ | 自分の分を持つ | 同じプロセスと共有する |
| データの受け渡し | 結果を送り返す必要がある | 同じ変数を読める |
| Pythonの計算を同時に進める | できる | 標準の実装では難しい |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
スレッドを増やせば、Pythonの計算はいつも速くなると思いがちです。標準の実装では、計算に使うスレッドは同時に1つしか進みません。計算を分けるなら、プロセスを使います。待ち時間の多い仕事には、スレッドが向きます。
ラボの端末で、2つのワーカーに分担させる
ラボにGPUはありません。Pythonの multiprocessing が、2つのプロセスで4つのチャンクを分担します。
スクリプトの出力には英語の単語が出ます。chunk の番号の次に部分和が並びます。どのプロセスが先に終わっても、結果はチャンクの順に返ります。
チャンクの部分和を出す
docker exec jupyter python3 steps/chunks.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに挑戦: 切り方を考える
100個のデータを、3人で分けるとします。33個ずつに切ると、最後は1個余ります。
余りを、一番最後のチャンクに足すのと、新しいチャンクにするのとでは、どちらが公平でしょうか。自分の言葉で説明しましょう。