0

私がPython関数でラップしている1つのC++ソースファイルに、誰かが次のものを含めました:

namespace some_namespace 
{ 
  static double some_double; 
}

float function_that_uses_some_double(float input) { 
  // implementation
  return result; 
}

静的グローバルsome_doubleは関数内でのみ使用されるため、これをCPython関数でラップし、シングルスレッドコードで呼び出すと、変数は一度に1つの関数でのみ使用されます。醜いですが、問題ありません。私の質問は、私が使用した場合に何が起こるかです:

  1. threadingモジュール、または
  2. multiprocessingモジュール。

このモジュールを使用している複数のプロセスやスレッドがある場合、それらは互いに干渉しますか?

4

2 に答える 2

1

スレッドモジュールを使用する場合、すべての関数はそのグローバル変数を共有するだけです。Pythonのスレッドはバイトコードの境界間で切り替えられるため、ロックは問題になりません。

マルチプロセッシングモジュールを使用する場合、状況は異なり、マルチプロセッシングの使用法に少し依存します。Pythonは単一のプロセスで開始するため、グローバル変数のコピーは1つだけです。マルチプロセッシング(つまり、メインプロセスから新しいPythonプロセスをフォークする)の使用を開始したときのその変数の値はサブプロセス(タスク)にコピーされますが、これらのプロセスにはそれぞれグローバル変数の独自のコピーがあります。

トリッキーになって共有メモリセグメント(MAP_SHAREDを使用したmmap)を設定し、変数がポインタである場合、ポイントされた場所は共有されるため、ロックを使用する必要があります。

于 2012-07-14T01:34:40.927 に答える
0

some_doubleを変更する場合(これはconst変数ではないためだと思います)、複数のスレッドを使用する場合は、何らかのロック(mutexなど)を行う必要があります。

于 2012-05-05T18:25:38.617 に答える