python使用oop在两个模块之间共享一个内存

时间:2014-06-29 19:06:09

标签: python oop

我有三个模块

(1)mem.py

memory = {}

class test(object):
    def __init__(self):
        global memory
        self.internal = memory

    def set(self,key,value):
        self.internal[key]=value
    def printmem(self):
        print self.internal 

(2)computer1.py

from mem import test

comp1 = test()

comp1.set(1,2)
comp1.printmem()

(3)computer2.py

from mem import test

comp2 = test()

comp2.set(3,4)
comp2.printmem()

现在在交互式shell中运行computer1.py,然后运行computer2.py。结果不是我想要的。当我运行computer2.py时,我希望comp2.printmem()打印{1:2,3:4}因为内存是全局的,它应该从comp1携带{1:2}到comp2但它只打印{3: 4}。我怎样才能解决这个问题 ?

2 个答案:

答案 0 :(得分:1)

不,你不对@LuckyStarr。每个进程都有自己的内存片段。当您运行python computer1.py时,Python解释器会加载computer1.py,导入mem.py。此调用的Python解释器使用一些内存,其中mem.py的全局变量驻留。一旦computer1.py完成执行,该过程就会彻底退出,释放所有已用内存。

现在当你运行computer2.py时,同样的事情又重新发生,即computer2.py被加载到一个新的Python进程中,它获取新的内存,加载mem.py然后你创建来自所有模块的对象在Python进程的生命周期内存在于内存中。

mem.py没有单独的内存份额。它的Python进程具有特定的共享内存,Python进程负责加载所有模块,包括mem.py和其他模块,如computer1.py。并且在此Python进程的范围内加载的对象仅在进程运行之前保留在内存中。

您无论如何都要将computer1.pycomputer2.py作为单独的Python流程运行 - 他们无法访问彼此的内存,直到他们决定使用其他技术执行此操作

答案 1 :(得分:0)

听起来你正试图在不同的和不相关的进程之间共享对象。为了简单地在共享公共Python祖先的进程之间共享对象,您可以使用Value or Array Objects模块中的multiprocessing(在标准库中)。

但是,要在不是由普通Python进程生成的进程之间共享对象(或者更常见的是内存)......这些进程不是" children"您执行的Python程序实例)您必须使用mmap模块(来自标准库)或SysV IPC的某些实现...并且您需要在这些较低级别的工具周围编写一些包装器,以便将对象序列化和反序列化。

我不知道是否正在维护POSH(未在PyPI上列出,网站上的最新更新似乎是从大约11年前开始的)。但是,这可能是您自己工作的起点。

除此之外,我建议您考虑采用不同的方法。使用Redis

Redis是一个键/值存储,支持许多数据类型作为值以及对这些值和键的许多服务器端操作。它通常被认为是NoSQL工具,并具有可选的持久性(文件系统)和复制(网络,从属)。此外,它支持一些"消息总线"操作Redis Pub/Sub

Python Redis支持分享listsdictionariesstrings and integerssets几乎无关紧要。此外,列表的一些操作和Redis语义使得将它们用作分布式Queue - 类似对象变得微不足道。

(此外,您可以" pickle"可以通过Redis值传递任何其他对象类型,可以是键上的字符串,也可以是" hash&#34中的字段;(字典))。

除此之外,Redis支持一些没有直接原生Python类似物的类型(例如sorted setsHyperLogLog。还可以通过其scripting功能向Redis添加一些其他语义实现服务器端嵌入式Lua处理)。

使用Redis可以在不相关的进程之间共享对象,但也可以跨网络将它们分发到其他系统。 Redis通常仅用作缓存系统(一种非分布式memcache。您还可以使用memcache作为不可靠的数据存储(在某种意义上,memcached上设置的任何值都可以随时到期)竞争过程活动。)

当您超越进程间通信和对象共享时(注意:任何IPC都可以是使用序列化/反序列化的对象共享机制)......您还可以考虑其他选项。基本上可以使用任何关系数据库(SQL RDBMS)或NoSQL系统,并且可以提供与mmap上可能实现的性能相当的性能。 (通常是序列化和反序列化将成为你的瓶颈;而典型的多核系统将拥有足够的CPU能力来托管你的Python进程以及任何常见的RDBMS和NoSQL(单节点)系统。