gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:37 24 4
gpt4 key购买 nike

我正在尝试在 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() 返回的每个进程都有自己的虚拟内存空间,与其他进程完全不同。他们不共享内存。

编辑:Per brian 在下面的评论中,从技术上讲,它们确实共享内存,直到内核决定将它们隔离(当一个 child 写入共享内存的一部分时)。不过,行为实际上是相同的。

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

如果你实际修改对象的内容并测试它们,你会发现即使内存位置看起来相同,但两者是完全不同的对象,因为它们属于两个不同的进程。实际上,您无法修改一个(没有某种进程间通信来调解)。

关于python - 无法在 mod_python 下获取类的单独实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/204427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com