在mod_python下无法获取类的单独实例

2 投票
1 回答
192 浏览
提问于 2025-04-11 09:35

我正在尝试在Apache 2.2和mod_python 3.2.8下运行一些Python代码。最终,这段代码会执行os.fork(),并生成两个独立的长时间运行的进程。每个进程都需要创建一个类的独立实例,以避免在并行执行时出现任何冲突。

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下会这样吗?有没有办法让它们各自有独立的实例呢?非常感谢。

1 个回答

3

repr()函数给出的内存位置是虚拟内存中的一个地址,而不是系统全局内存中的地址。每个通过fork()创建的进程都有自己独立的虚拟内存空间,这些空间是完全不同的,进程之间并不共享内存。

补充:根据brian的评论,技术上讲,它们确实会共享内存,直到内核决定将它们分开(比如当一个子进程写入共享内存的一部分时)。不过,实际表现上是一样的。

你的程序结构是相同的,所以Python在每个进程的独立虚拟内存中,为每个相同的对象使用相同的虚拟内存位置。

如果你真的修改这些对象的内容并进行测试,你会发现虽然内存位置看起来相同,但这两个对象是完全不同的,因为它们属于两个不同的进程。实际上,你不能直接从一个进程修改另一个进程的对象(除非通过某种进程间通信的方式来实现)。

撰写回答