无法获取mod\u python下某个类的单独实例

2024-06-16 10:51:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Apache2.2/mod iupython3.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)

输出如下:

^{pr2}$

如你所见,我为两个子进程得到了相同的对象。 你知道为什么在mod\upython下会这样吗?有没有一种方法可以获得单独的实例? 谢谢。在


Tags: 实例代码inmodforfoo进程os
1条回答
网友
1楼 · 发布于 2024-06-16 10:51:36

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

编辑:根据brian下面的评论,从技术上讲,在内核决定隔离它们之前(当孩子写入共享内存的一部分时),它们确实共享内存。不过,这种行为实际上是一样的。在

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

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

相关问题 更多 >