Python 让类处理pickle

Python 让类处理pickle,python,pickle,Python,Pickle,我正在修改一些代码,以在ec2中而不是在openstack中加速虚拟机。Main为每个VM启动一个线程,然后各个模块在这些VM上执行任务。每个线程控制自己的VM。因此,与其向所有下游模块添加参数以查找信息,或者更改所有代码以取消创建vm的类实例的pickle,我希望可以让类本身决定是启动新vm还是返回现有pickle。这样大部分代码就不需要修改了 这是总体思路,也是我最接近于让它发挥作用的地方: import os import sys import pickle if sys.version_

我正在修改一些代码,以在ec2中而不是在openstack中加速虚拟机。Main为每个VM启动一个线程,然后各个模块在这些VM上执行任务。每个线程控制自己的VM。因此,与其向所有下游模块添加参数以查找信息,或者更改所有代码以取消创建vm的类实例的pickle,我希望可以让类本身决定是启动新vm还是返回现有pickle。这样大部分代码就不需要修改了

这是总体思路,也是我最接近于让它发挥作用的地方:

import os
import sys
import pickle
if sys.version_info >= (2, 7):
    from threading import current_thread
else:
    from threading import currentThread as current_thread



class testA:
    def __init__(self, var="Foo"):
        self.class_pickle_file = "%s.p" % current_thread().ident
        if os.path.isfile(self.class_pickle_file):
            self.load_self()
        else:
            self.var = var
            pickle.dump(self, open(self.class_pickle_file, "wb"))
    def test_method(self):
        print self.var
    def load_self(self):
        return pickle.load(open(self.class_pickle_file, "rb"))




x = testA("Bar")
y = testA()
y.test_method()
但这会导致:
name错误:未定义全局名称“var”

但是,如果我执行
y=pickle.load(open(“140355004004096.p”,“rb”))
它工作得很好。因此,数据是通过在类中存储
self
而进入的,这是一个让类返回pickle而不是自身的问题


有什么想法吗?谢谢

在我看来,您创建了一个以当前线程的标识命名的文件,然后使用同一线程实例化另一个TestA对象(!!same Identit!!),因此它会检查pickle文件(并找到它,这很糟糕),然后self.var永远不会被设置

在test_方法中,检查从未设置的变量


在它自己的线程中运行每个项以获得不同的标识,或者确保不管怎样都设置self.var。

是的,它的目标是找到它并从返回的pickle中加载该类的版本,该pickle已定义self.var(当我从类外部加载它时会这样做,但当我从类内部加载它时不会这样做)是的,但我认为我沟通错误的地方是你的测试方法不起作用。您正在根据线程的id存储内容,但这并没有实现您希望它实现的目标。我认为您希望类的每个实例都有一个唯一的pickle,但实际上,您正在将在该线程中创建的任何类保存到同一个pickle文件中。