プログラミング言語のマルチスレッド処理まとめ

プログラミング

たくさんの処理を効率よく行うための手法として並列処理があります。

処理の単位をスレッドと呼び、並列で処理することをマルチスレッドと呼びます。

多くのプログラミング言語ではマルチスレッド処理を行うための機能が標準で提供されています。

本ブログでは、Python、Java、Ruby、Goのマルチスレッド処理について解説してきました。

本記事では、各言語のマルチスレッド処理について、比較しながらまとめていきます。

各言語における違いが分かったり、書き方を忘れてしまったときの復習用としても役立つ内容になっていますので、ぜひ最後までご覧いただければと思います。

本記事の最後に、各言語のソースコードを含む詳細内容を確認できる、関連ページへのリンクも用意しておきますので、気になる方はチェックしてみてください。

プログラミング言語のマルチスレッド処理まとめ

各言語のマルチスレッド処理について、以下の内容でまとめていきます。

  • マルチスレッドを扱うモジュールやパッケージ
  • スレッドの作成と起動
  • スレッドからの戻り値やメッセージの取得
  • スレッドプールの作成

マルチスレッドを扱うモジュールやパッケージ

言語 マルチスレッドを扱うモジュールやパッケージ
Python
  • スレッド:threadingモジュールをimport
  • スレッドプール:concurrent.futuresモジュールをimport
Java
  • スレッド:java.langパッケージ(標準パッケージ)
  • スレッドプール:java.util.concurrentパッケージをimport
Ruby
  • スレッド:組込みライブラリ
Go
  • スレッド:標準ライブラリ(goroutine)

スレッドを扱うための機能は、各言語ともに標準ライブラリやパッケージに含まれているため、特別なものは不要です。

スレッドを効率よく処理するためのスレッドプールを扱うための機能は、言語により提供されているものとないものがあります。

スレッドの作成と起動

言語 スレッドの作成と起動
Python
  • 作成:スレッド化する関数を指定する。
  • 起動:startメソッドを呼び出す。
  • 待合せ:joinメソッドでスレッドが終了するまで待機。
Java
  • 作成:Threadクラスを継承する、またはRunnableインタフェースを実装する。
  • 起動:Threadクラスのstartメソッドを呼び出す。
  • 待合せ:Threadクラスのjoinメソッドでスレッドが終了するまで待機。
Ruby
  • 作成:Threadクラスのnewまたはstartまたはforkに、スレッド化する関数を指定する。
  • 起動:スレッドの作成と同時に起動する。
  • 待合せ:joinメソッドでスレッドが終了するまで待機。
Go
  • 作成:goステートメントにスレッド化する関数を指定する。
  • 起動:スレッドの作成と同時に起動する。
  • 待合せ:syncパッケージのWaitGroupのWaitやDoneによって制御する。

スレッド化する処理は、事前に関数やメソッドとして作成しておき、それをスレッド作成時に指定します。

スレッドを起動した後に、呼び出し元のメインスレッドは処理が進んでしまうため、スレッドの処理が終了するまで待機させておく必要があります。

スレッドからの戻り値やメッセージの取得

言語 スレッドからの戻り値やメッセージの取得
Python
  • 準備:ThreadPoolExecutorのsubmitで起動したスレッドからFutureを受け取る。
  • 取得方法:Futureのresultで戻り値を取得する。
Java
  • 準備:Callableインタフェースを実装したスレッドを起動してFutureを受け取る。
  • 取得方法:Futureのgetで戻り値を取得する。
Ruby
  • 取得方法:スレッドを起動してvalueで戻り値を取得する。
Go
  • 取得方法:チャネルを使ってメッセージを受信する。

スレッドから情報を受け取るには、最後に戻り値として受け取る方法と、任意のタイミングでメッセージとして受け取る方法があります。

Python、Java、Rubyは最後に戻り値として受け取る方法を標準で提供しています。

Goはスレッド間でメッセージをやり取りするチャネル機能を標準で提供しています。

スレッドプールの作成

言語 スレッドプールの作成
Python
  • 作成:concurrent.futures.ThreadPoolExecutorにプールする数を指定して作成する。
  • 起動:submitにスレッド化する関数を指定する。
  • 待合せ:shutdownで終了するまで待機する。
Java
  • 作成:java.util.concurrent.Executorsでプールする数を指定して作成する。
  • 起動:submitにスレッド化するクラスを指定する。
  • 待合せ:awaitTerminationで終了するまで待機する。
Ruby
  • 標準機能としてスレッドプールの機能は提供されていないが、Thread::QueueやThread::SizedQueueを実装することにより同様の機能を実現することが可能。
Go
  • 標準機能としてスレッドプールの機能は提供されていない

スレッドプールにより同時処理するスレッドの数を制限することができます。

PythonやJavaにはスレッドプールを扱うための機能が標準で提供されています。

Goはスレッド自体が軽量であり、OSスレッド上に作成されるため、スレッドの実行数をプログラム内で制御する必要はないという仕組みの違いがあります。

時間のかかる処理はマルチスレッド処理で効率よく実行しよう

UIに関連する処理や外部APIと連携する処理は、待ち時間が長くなると、利用者に不便な印象を与えてしまいます。

時間がかかる処理が複数ある場合は、マルチスレッドにより同時並行で処理できると全体の処理時間を短縮することができ、利用者の印象も良くなります。

 

今回はマルチスレッド処理について、各言語を比較しながらまとめました。

ソースコードも含めた各言語の詳細が記述されている、関連ページヘのリンクを以下にまとめておきますので、気になる方はチェックしてみてください。

以上、参考になれば幸いです。

各言語のマルチスレッド処理記事

Pythonのマルチスレッド処理【プログラミング初心者向け教材】
Pythonではマルチスレッド処理を行うための機能が標準で提供されています。 本記事では、Pythonのマルチスレッド処理について解説します。
Javaのマルチスレッド処理【プログラミング初心者向け教材】
Javaではマルチスレッド処理を行うための機能が標準で提供されています。 本記事では、Javaのマルチスレッド処理について解説します。
Rubyのマルチスレッド処理【プログラミング初心者向け教材】
Rubyではマルチスレッド処理を行うための機能が標準で提供されています。 本記事では、Rubyのマルチスレッド処理について解説します。
Goのマルチスレッド処理【プログラミング初心者向け教材】
Goではマルチスレッド処理を行うための機能が標準で提供されています。 本記事では、Goのマルチスレッド処理について解説します。

コメント

タイトルとURLをコピーしました