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