让班级处理泡菜

时间:2015-04-30 17:28:00

标签: python pickle

我正在更改一些代码以在ec2而不是openstack中启动VM。 Main为每个VM启动一个线程,然后各个模块在这些VM上执行任务。每个线程控制它自己的VM。因此,不是必须向所有下游模块添加参数以查找信息,或者必须更改所有代码以取消创建vm的类实例,我希望我可以让类自己决定是否启动新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()

但结果是:NameError: global name 'var' is not defined

但是,如果我做y = pickle.load(open("140355004004096.p", "rb"))它就可以了。所以数据是通过将self存储在类中而进入的,这是让类返回pickle而不是自己的问题......

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在我看来,你创建一个由当前线程的ident命名的文件,然后使用相同的线程(!! same ident !!)实例化另一个TestA对象,因此它会检查pickle文件(并发现它,这很糟糕,然后self.var永远不会被设置。

在test_method中,检查一个从未设置过的变量。

在自己的线程中运行每个项目以获得不同的标识,或者确保无论如何都设置self.var。