2

Apache 2.2 / mod_python 3.2.8 で Python コードを実行しようとしています。最終的に、コードは os.fork() を実行し、2 つの個別の長期実行プロセスを生成します。これらの各プロセスは、並列フローで起こりうる衝突を回避するために、クラスの個別のインスタンスを作成する必要があります。

class Foo(object):
   pass

kidprocs = []

for kid in ('kid1', 'kid2'):

  pid = os.fork()
  if pid:
    # parent
    kidprocs.append(pid)
    time.sleep(5)
  else:
    # child

    fooobj = Foo() 
    print "Starting %s in sub-process %s" % (kid, os.getpid())
    print "Kid fooobj: %s" % repr(fooobj) 
    os._exit(0)

for kidproc in kidprocs:
  os.waitpid(kidproc, 0)

これらの印刷出力は次のようになります。

Starting kid1 in sub-process 20906
    foo obj: <__main__.Foo instance at 0xb7da5fec>

Starting kid2 in sub-process 20909
    foo obj: <__main__.Foo instance at 0xb7da5fec>

ご覧のとおり、両方のサブプロセスで同じオブジェクトを取得しました。なぜ mod_python の下でこのようになっているのか、また別のインスタンスを取得する方法はありますか? どうもありがとう。

4

1 に答える 1

3

関数によって指定されるメモリ位置repr()は、システムのグローバル メモリ内のアドレスではなく、仮想メモリ内のアドレスです。fork() によって返される各プロセスには、他のプロセスとは完全に異なる独自の仮想メモリ空​​間があります。それらはメモリを共有しません。

編集:以下のブライアンのコメントによると、技術的には、カーネルがそれらを分離することを決定するまで(子が共有メモリの一部に書き込むとき)メモリを共有します。ただし、動作は事実上同じです。

プログラムの構造は同じであるため、python は各プロセスの個別の仮想メモリ ストア内の同じ仮想メモリ ロケーションを 、各子の同一オブジェクトごとに使用します。

オブジェクトの内容を実際に変更してテストすると、メモリの場所は同じに見えますが、2 つのオブジェクトは 2 つの異なるプロセスに属しているため、完全に異なるオブジェクトであることがわかります。実際には、一方を他方から変更することはできません (仲介するための何らかのプロセス間通信がなければ)。

于 2008-10-15T12:05:04.540 に答える