Python类的共享内存

时间:2015-06-15 18:33:21

标签: python python-2.7 shared-memory

因此,当我学习Python中的类时,我被教导类级属性在给定类的所有实例之间共享。我不认为我以前见过任何其他语言。

因此,我可以有多个实例,比如说一个数据库类拉动数据DB数据并将其转储到类级属性中。然后,任何需要任何数据的实例都可以访问它而无需转到缓存或保存文件 得到它。

目前我正在调试一个分析类,它通过一种低效的手段来抓取数据库数据 - 我目前正试图加快速度。现在需要几分钟才能加载数据库数据。我使用ndarrays为数据选择的格式不希望通过numpy.save保存到文件中(我现在不记得错误)。每次我做一些调整都会丢失数据,我必须等几分钟才能重新加载。

所以我想到我可以创建一个用于保存数据的简单类。我不需要改变的类可以在单独的iPython控制台下运行(我使用的是Anaconda,Python 2.7和Spyder)。这样我就可以将分析类链接到分析类的init中的共享数据类。像这样:

def __init__(self):
  self.__shared_data = SharedData()
  self.__analytics_data_1 = self.__shared_data['analytics_data_1']

我的想法是,我会在分析类方法中写入self.__analytics_data_1。它将自动更新为分片数据类。我打开一个iPython控制台,除了在调试期间保存共享数据类的实例。这样,当我必须重新加载并重新实例化分析类时,它只会获取我已捕获的任何数据。显然,如果数据本身存在问题,则需要手动删除。

显然,我不想为我构建的每个工具使用相同的共享数据类。但这很简单。我之所以提到这一切的原因是我无法在网上找到这样的食谱。似乎有很多食谱,所以我认为缺少食谱可能是一个迹象,这是一个坏主意。

我试图在PHP项目中通过Memcache实现类似的功能。但是,在那个项目中,我进行了大量的读写操作,似乎代码导致了某种形式的写冲突。所以数据没有得到更新。 (并且Memcache不保证数据会在那里。)防止这种写入冲突意味着需要额外的代码,额外的处理时间,最终代码变得太慢而无法使用。我想我可以在Python中使用这个共享内存再次尝试它,以及使用共享内存进行调试。

思考?警告?

1 个答案:

答案 0 :(得分:0)

如果您希望在类实例之间共享数据,则应该执行以下操作:

class SharedDataClass(object):
  shared_data = SharedData()

除非在构造函数中覆盖in,否则这些SharedData实例将在类实例之间共享。 小心,GIL锁定可能会影响性能!

在“控制台”或进程之间共享数据是不同的故事。它们是独立的进程,当然,类属性不是共享的。在这种情况下,您需要IPC(可能是文件系统,数据库,连接开放套接字的进程等)