我有一个程序,我需要在其中将一个全局变量存储到一个文件中。我正在使用 pickle
模块执行此操作。
我有另一个thread
(Daemon=False
,来自threading
模块),它有时会更改全局变量的值。该值也在全局范围(主程序)中被修改。
我每 5 秒将变量的值转储到一个 .pkl
文件中(使用来自 threading
模块的另一个 thread
)。
但是在执行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).
最佳答案
正如其他人所提到的,您不能挑选“易变”实体(线程、连接、同步原语等),因为它们作为持久数据没有意义。
看起来您正在尝试做的是保存 session 变量,以便稍后继续进行上述 session 。对于该任务,您无法执行任何操作来保存由于其性质而无法保存的对象。
最简单的解决方案就是忽略它们。用一些“ stub ”替换它们,只要你对它们做任何事情都会产生错误,这是没有意义的,因为丢失的变量无论如何都会产生错误(如果它屏蔽了一个全局变量,它不会产生错误,但这本身就是一个值得怀疑的做法).
或者,您可以在恢复 session 时重新设置这些对象。但这样的逻辑必然是特定于任务的。
最后,例如IPython already has session saving/restoration logic ,因此您可能根本不需要重新发明轮子。
关于python - 在线程之间共享对象时如何避免 pickle 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39286665/