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

时间:2008-10-15 11:47:27

标签: python apache mod-python

我正在尝试在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下发生这种情况吗?有没有办法获得单独的实例? 非常感谢。

1 个答案:

答案 0 :(得分:3)

repr()函数给出的内存位置是虚拟内存中的地址,而不是系统全局内存中的地址。 fork()返回的每个进程都有自己的虚拟内存空间,这与其他进程完全不同。他们没有共享记忆。

编辑:下面的每个brian的评论,从技术上讲,它们会共享内存,直到内核决定将它们隔离(当一个孩子写入共享内存的一部分时)。但是,这种行为实际上是一样的。

程序的结构是相同的,因此python在每个进程的不同虚拟内存存储中为每个子进程使用相同的虚拟内存位置

如果您实际修改了对象的内容并对其进行了测试,您会看到即使内存位置看起来相同,这两个对象也完全不同,因为它们属于两个不同的进程。实际上,你不能修改另一个(没有某种进程间通信来调解)。