我有三个模块
(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}。我怎样才能解决这个问题 ?
答案 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.py
和computer2.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支持分享lists,dictionaries,strings and integers和sets几乎无关紧要。此外,列表的一些操作和Redis语义使得将它们用作分布式Queue - 类似对象变得微不足道。
(此外,您可以" pickle"可以通过Redis值传递任何其他对象类型,可以是键上的字符串,也可以是" hash&#34中的字段;(字典))。
除此之外,Redis支持一些没有直接原生Python类似物的类型(例如sorted sets和HyperLogLog。还可以通过其scripting功能向Redis添加一些其他语义实现服务器端嵌入式Lua处理)。
使用Redis可以在不相关的进程之间共享对象,但也可以跨网络将它们分发到其他系统。 Redis通常仅用作缓存系统(一种非分布式memcache。您还可以使用memcache作为不可靠的数据存储(在某种意义上,memcached上设置的任何值都可以随时到期)竞争过程活动。)
当您超越进程间通信和对象共享时(注意:任何IPC都可以是使用序列化/反序列化的对象共享机制)......您还可以考虑其他选项。基本上可以使用任何关系数据库(SQL RDBMS)或NoSQL系统,并且可以提供与mmap
上可能实现的性能相当的性能。 (通常是序列化和反序列化将成为你的瓶颈;而典型的多核系统将拥有足够的CPU能力来托管你的Python进程以及任何常见的RDBMS和NoSQL(单节点)系统。