Pythonのthreadとprocessの違いについて改めて確認してみる。

  • 2021.08.14
  • IT
Pythonのthreadとprocessの違いについて改めて確認してみる。

はじめに

適当に使っていたスレッドとプロセスって何が違うのだろう、と思い、コードの挙動を見ながら検証してみました。

検証環境

Windows10 Home

Python3.9.2

用語の定義

  • マルチタスク
    • 複数のプログラムコードを同時並行に実行させる仕組み
  • マルチタスクシステム
    • 何をタスクにするのかによってさまざまだが、「プロセス」を単位とする「マルチプロセス」と「スレッド」を単位とする「マルチスレッド」がよく用いられる。
  • プロセス
    • (おおよそ)アプリケーションに対応し、他のプロセスと動作ができるだけ干渉しないようにメモリ空間、ファイルハンドルなどの計算機資源が独立して管理されている
    • プロセス間の関係は「粗」
    • 他のプロセスのメモリには(原則)直接アクセスできない
  • スレッド
    • 1つのプロセス内で並列処理を行うための機構。多くの計算機資源を他のスレッドと共有する。
    • OSの視点だと、スレッドがプログラムの最少単位であり、「計算機資源を共有するいくつかのスレッドをまとめて取り扱う単位がプロセスである」ということができる。
    • スレッド間の関係は「密」
    • 他のスレッドのメモリに直接アクセスできる(メモリ空間が同一)
    • 指定しない場合、処理の順番はOSの気まぐれ

Threadとprocessの違い

主な違い

下記の表のような違いがありますが、グローバル変数を共有できる(スレッド)か、できない(プロセス)か、というのは利用上大きな違いがあるかと思います。

計算機資源 プロセス スレッド
メモリ 他のプロセスのメモリには(原則として)直接アクセスできない 他のスレッドのメモリに直接アクセスできる。(メモリ空間が同一)
ファイルハンドル 他のプロセスが作成したファイルハンドルを操作することはできない。 他のスレッドが作成したファイルハンドルを使うことができる。
ファイル実体 ファイルパス名が同じファイルは(原則として)すべてのプロセスで同じもの。 ファイルパス名が同じファイルは(原則として)すべてのスレッドで同じもの。
スレッド 他のプロセス内にスレッドを作成したり他のプロセス内のスレッドを停止したりすることは(原則として)できない。 他のスレッドが作成したスレッドを操作することができる。

Linuxとpthreadによる マルチスレッドプログラミング入門P2より

 

メモリ空間のイメージ

下記の図のように、スレッドでは、同一のメモリを共用していますが、

プロセスはメモリを各プロセスのメモリへコピーをしています。

この仕組みの違いが、スレッドとプロセスの挙動の違いを生み出しています。

 

コードで違いを見てみる

Process

上記の実行結果はこうなります。

注目していただきたいのは、11行目です。

プロセスが起動された際に、グローバル変数がまた初期化されています。

つまり、変数名が同じグローバル変数が、メモリの別の場所に宣言されている、ということです。

これはメモリの場所(id)の値を見ても分かりますね。

実装する際の注意点としては、親プロセスでグローバル変数の値を変更していたとしても、

子プロセスのグローバル変数の値は、グローバル変数が宣言時の値になる、ということです。(14行目)

Thread

 

上記の実行結果は下記になります。

 

メモリを共有しているので、グローバル変数の値は親子で相互に影響を受けています。

まとめ

大きな違いは、メモリを共有しているか、していないか、だと私は感じました。

そこから各手法のメリットデメリットが生じてくると思います。

参考文献

入門Python3 第二版

Linuxとpthreadによる マルチスレッドプログラミング入門