Python 在线程之间共享对象时如何避免酸洗错误?

Python 在线程之间共享对象时如何避免酸洗错误?,python,multithreading,pickle,locks,Python,Multithreading,Pickle,Locks,我有一个程序,我需要将一个全局变量存储到一个文件中。我使用pickle模块来完成这项工作 我有另一个线程(Daemon=False,来自线程模块),它有时会更改全局变量的值。该值也在全局范围(主程序)中修改 我每5秒将变量的值转储到.pkl文件中(使用线程模块中的另一个线程) 但是我在执行dump方法时发现了以下错误: TypeError: can't pickle _thread.lock objects 为什么会这样?我能做些什么来修复它 注意:我在多处理模块中找到了一些类似的答案。但是我

我有一个程序,我需要将一个全局变量存储到一个文件中。我使用
pickle
模块来完成这项工作

我有另一个
线程
(Daemon=
False
,来自
线程
模块),它有时会更改全局变量的值。该值也在全局范围(主程序)中修改

我每5秒将变量的值转储到
.pkl
文件中(使用
线程
模块中的另一个
线程

但是我在执行
dump
方法时发现了以下错误:

TypeError: can't pickle _thread.lock objects
为什么会这样?我能做些什么来修复它

注意:我在
多处理
模块中找到了一些类似的答案。但是我需要一个
线程
模块的答案

代码:


正如其他人所提到的,您不能pickle“volatile”实体(线程、连接、同步原语等),因为它们作为持久数据没有意义

看起来您试图做的是保存会话变量,以便以后继续所述会话。对于该任务,您无法保存由于其性质而无法保存的对象

最简单的解决办法就是忽略它们。用一些“存根”替换它们,在您对它们执行任何操作时都会产生错误,这毫无意义,因为丢失的变量无论如何都会产生错误(如果它屏蔽了一个全局变量,则不会产生错误,但这本身就是一种有问题的做法)

或者,您可以在恢复会话时重新设置这些对象。但这种逻辑必然是特定于任务的


最后,例如IPython,因此您可能根本不需要重新发明轮子。

您无法pickle锁对象,因为它与其他线程当前持有的操作系统/信号量的当前状态有关。如果您想pickle直接或间接引用锁的类型,您需要实现自己的方法。锁是否被释放并不重要,它们不能被pickle。但是当目标函数终止时,锁是否应该被释放,因为只剩下一个线程?另外,如果您可以提供一个示例代码,这将非常有助于讨论您的代码,我们真的需要查看它。你能给我们看看有问题的锁吗?它是您正在pickle的某个对象的属性,还是您正试图直接pickle它?您能更具体地使用ipython中的会话逻辑吗?我还可以将这些易失性变量存储在数据库中吗?第一:完成,第二:您了解序列化的要点和“作为持久数据没有意义”部分了吗?
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).