[英]Failed to get separate instances of a class under 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 下会这样吗?无论如何有办法获得单独的实例吗? 非常感谢。
repr()
函数给出的内存位置是虚拟内存中的地址,而不是系统全局内存中的地址。 fork() 返回的每个进程都有自己的虚拟内存空间,与其他进程完全不同。 它们不共享内存。
编辑:根据下面布莱恩的评论,从技术上讲,它们确实共享内存,直到内核决定将它们隔离(当孩子写入共享内存的一部分时)。 但是,行为实际上是相同的。
您的程序的结构是相同的,因此对于每个子进程的每个相同对象,python在每个进程的不同虚拟内存存储中使用相同的虚拟内存位置。
如果你实际修改对象的内容并测试它们,你会发现即使内存位置看起来一样,但两者是完全不同的对象,因为它们属于两个不同的进程。 实际上,您不能从另一个修改一个(没有某种进程间通信来调解)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.