我有一个程序,我需要将全局变量存储到文件中。我是使用pickle
模块执行此操作的。
我有另一个thread
(守护程序= False
,来自threading
模块),它有时会更改全局变量的值。该值也在全局范围(主程序)中修改。
我每隔5秒将变量的值转储到.pkl
文件中(使用thread
模块中的另一个threading
。
但是我在执行dump
方法时发现了以下错误:
TypeError: can't pickle _thread.lock objects
为什么会这样?我该怎么做才能解决它?
注意:我在multiprocessing
模块中找到了一些类似的答案。但我需要threading
模块的答案。
代码:
def save_state():
while True:
global variable
lastSession = open('lastSession.pkl', 'wb')
# error occurs on this line
pickle.dump(variable, lastSession)
lastSession.close()
time.sleep(5)
state_thread = threading.Thread(target = save_state)
state_thread.setDaemon(False)
state_thread.start()
# variable is changed outside this function and also in another thread(not state_thread).
答案 0 :(得分:0)
正如其他人所提到的那样,你不能腌制"挥发性"实体(线程,连接,同步原语等),因为它们作为持久数据没有意义。
看起来你正在尝试做的是保存会话变量以便以后继续所述会话。对于那项任务,你无法做任何事情来保存那些由于其性质而无法保存的对象。
最简单的解决方案就是忽略它们。用一些"存根替换它们"任何时候你用它们做任何事都会产生错误没有意义,因为一个缺失的变量无论如何都会产生错误(如果它掩盖了一个全局变量它就会胜出,但这本身就是一个可疑的做法)。
或者,您可以在还原会话时重新设置这些对象。但这种逻辑必然是针对任务的。
最后,例如IPython already has session saving/restoration logic,所以你可能根本不需要重新发明轮子。