threadingモジュールでマルチスレッド処理

Pythonは基本的に同期・シリアル実行ですが、threadingモジュールを使うと、複数のスレッドを立ち上げて非同期に処理させることができます。
Pythonは仕様上、マルチスレッドでの処理速度向上が難しいようですが、処理の内容によっては効果的な場合もあるらしいので今回はその例です。

サンプル

今回のサンプルを先に記載しておきます。ある関数(_subroutine())を複数のスレッドで実行するだけの単純なものです。やり方はいろいろありますが、おそらく最も簡単な例と思われるものを掲載しておきます。

実行例はこんな感じ。各スレッドの名前と引数をプリントしています。非同期なのでスレッドの立ち上がり方は不定です。

以下に詳細を記載しておきます。

threadingモジュールを使ったマルチスレッド処理

ここではリストを引数にして、複数のスレッドに処理を割り当てます。
呼び出す関数で処理を完結させているので返り値はありません。処理の結果が必要な場合はQueueを使うなどして複数のスレッドから更新を受け付けるような仕組みが必要になりますが、今回は触れません。

Threadオブジェクト

基本はThreadオブジェクトに別スレッドで実行したい関数(target)と、引数(args)を指定して開始(.start()メソッド)させるだけです。
また、.join()メソッドで各スレッドの完了を明示的に待ち合わせることができます。もちろんメインスレッドで間に他の処理を記述しても構いません。

引数(args)はタプルですがどうやらリストも受け付けるので、引数(positional)そのものにリストを渡すために上記の変な書き方をしています。

リストの分割

マルチスレッドの使い方そのものとは関係ありませんが、サンプルには引数として渡すためにリストを分割する処理も記載しています。

元のリスト(src_)に対し、分割数(num_、ここではスレッド数を想定)に応じてリストのリストとして返します。

元のリストの長さに関わらず、指定した数(以下)に分割できるので地味に便利です。

おわり。