Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python使用oop在两个模块之间共享内存_Python_Oop - Fatal编程技术网

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

python使用oop在两个模块之间共享内存,python,oop,Python,Oop,我有三个模块 (1) mem.py (2) 计算机1.py from mem import test comp1 = test() comp1.set(1,2) comp1.printmem() (3) 计算机2.py from mem import test comp2 = test() comp2.set(3,4) comp2.printmem() 现在在交互式shell中,我运行computer1.py,然后运行computer2.py。结果不是我想要的。当我运行compute

我有三个模块

(1) mem.py

(2) 计算机1.py

from mem import test

comp1 = test()

comp1.set(1,2)
comp1.printmem()
(3) 计算机2.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},因为内存是全局的,它应该将{1:2}从comp1带到comp2,但它只打印{3:4}。我怎样才能解决这个问题

不,你说得不对@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.py
computer2.py
作为单独的Python进程运行—在它们决定使用其他技术之前,它们无法访问彼此的内存。

听起来好像您在试图跨单独和不相关的进程共享对象。为了简单地在共享公共Python祖先的进程之间共享对象,您可以从模块中使用(在标准库中)

但是,要在不是由普通Python进程生成的进程之间共享对象(或者更一般地说,共享内存)。。。它们不是您执行的Python程序实例的“子对象”)您必须使用模块(来自标准库)或某些实现。。。您需要围绕这些较低级别的工具编写一些包装器,以便将对象序列化和反序列化到其中

我不知道是否正在维护(网站上没有列出,最近一次更新似乎是在11年前)。然而,这可能是你自己工作的起点

除此之外,我建议你考虑另一种方法。使用

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

这种支持使得共享、和变得几乎微不足道。此外,列表的一些操作和Redis语义使得将它们用作分布式对象变得很简单

(此外,可以“”的任何其他对象类型都可以通过Redis值传递,可以作为键上的字符串,也可以作为“哈希”(字典)中的字段)

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

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


当您超越进程间通信和对象共享(注意:任何IPC都可以是使用序列化/反序列化的对象共享机制)时,还有其他选项可以考虑。基本上是任何关系数据库(SQL RDBMS)。或者可以使用NoSQL系统,并且可以提供与通过

mmap
实现的性能相当的性能(通常是序列化和反序列化,这将是您的瓶颈;典型的多核系统将具有足够的CPU能力来承载Python进程和任何常见的RDBMS或NoSQL)(单节点)系统。

你说的“运行”是什么意思computer1和computer2?您的意思是从系统提示符运行它们,还是从Python解释器内部运行它们?如果是从Python解释器内部运行,如何运行?确切地说。如果您在交互式shell(即同一进程)中运行这两个脚本,那么您应该会得到预期的结果(除非你正在做一些有趣的事情,比如重新加载一个模块)。@BrenBarn:我去终端(而不是解释器内部),然后键入“>>>python comp1.py”,然后键入“>>>python comp2.py”@Vaidik:我将同一个模块导入到两个不同的文件中。但是我已经声明内存为全局变量。即使测试模块实例化了两次comp1和comp2,全局内存在任何地方都是相同的。但是我没有得到内存为{1:2,3:4}当我在comp1之后运行comp2.py时。py@LuckyStarr:那么您运行的是两个完全不共享的独立程序。在我写这篇文章时,我确实搜索了Python共享和分布式内存子系统的OO包装。我确信我在过去看到过一些。但它们似乎都没有得到积极维护,也不容易在这里找到谢谢你的回答,吉姆D。谢谢你的回答
from mem import test

comp2 = test()

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