在mod_python下无法获取类的单独实例
我正在尝试在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在每个进程的独立虚拟内存中,为每个相同的对象使用相同的虚拟内存位置。
如果你真的修改这些对象的内容并进行测试,你会发现虽然内存位置看起来相同,但这两个对象是完全不同的,因为它们属于两个不同的进程。实际上,你不能直接从一个进程修改另一个进程的对象(除非通过某种进程间通信的方式来实现)。