我正在更改一些代码以在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而不是自己的问题......
有什么想法吗?谢谢。
答案 0 :(得分:0)
在我看来,你创建一个由当前线程的ident命名的文件,然后使用相同的线程(!! same ident !!)实例化另一个TestA对象,因此它会检查pickle文件(并发现它,这很糟糕,然后self.var永远不会被设置。
在test_method中,检查一个从未设置过的变量。
在自己的线程中运行每个项目以获得不同的标识,或者确保无论如何都设置self.var。