threading と multiprocessing

パソコンには cpu と呼ばれる計算装置が入っています。そのcpuにはコアが複数個入っています。4コアとか8コアという言葉は、この計算装置の数を表しています。
通常、何か処理をさせるプログラムを書いて実行させたとき、どれか空いている1つのコアを用いて計算します。そしてその計算をしている間は、そのコアは別の作業をすることができません。

ですが実際には、1つの処理を行いながら別の処理も 同時に 行う必要がある場合があります。その代表的なものがアクションゲーム。アクションのジャンルでは様々なキャラクターが1フレームごとに動く距離や位置を計算することで成り立っています。こういった並列処理をしなければ、キャラクターがたった1つしか動かないようなゲームとなってしまいます。

ということで今回はその並列処理の書き方を簡単に紹介します。例外処理が大変で、突き詰めればとても難しい内容となるので基本の基本だけ。


Pythonでは並列処理は threading と multiprocessing というモジュールが用意されています。
multiprocessing が複数コアを使うのに対して(マルチプロセス化)、threading は1コアの中を複数の領域に分けて使います(スレッド化)。


まずは threading の使い方を見てみます。

(9-10行目) 並列に処理させたい内容を t1 と t2 として定義します。処理内容は関数内。
(11-12行目) スレッドをデーモン化しています。プログラム内で処理しているスレッドが全てデーモンスレッドになった場合、そのプログラムをその瞬間に(デーモンスレッドが途中であっても)終了させるようになります。このプログラムではデーモンスレッドにする意味はありませんが、デーモン化する方法を知らないと、全てのスレッド処理が終わるまで待つしかなくなるので・・・。
(13-14行目) スレッドをスタートして、スレッドリストに加えています。これで複数(この場合は2つ)の計算を同時に行い、出力結果には t1 と t2 が混ざったものになります。


続いて multiprocessing の使い方を見ていきましょう。

(9-10行目) ここで呼ぶクラスが変わるだけで、後は同じ書き方でいけます。

実行中に空いている端末でプロセスを確認すると(topコマンドなど)、threading では1つの、multiprocessing では複数のコアを使っていることも確認できます。

両者の使いわけですが、1つ1つが簡単な処理の場合には threading で十分、計算が重くて大変な時は multiprocessing の方が1つのコアをフルタイムで使える分処理が早く終わると考えて良いと思います。ただし multiprocessing を使う場合、コアを使いすぎてパソコン全体に負荷をかけないように。


Pythonの記事一覧へは こちら から。