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

时间:2016-09-02 07:28:09

标签: python multithreading pickle locks

我有一个程序,我需要将全局变量存储到文件中。我是使用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).

1 个答案:

答案 0 :(得分:0)

正如其他人所提到的那样,你不能腌制"挥发性"实体(线程,连接,同步原语等),因为它们作为持久数据没有意义。

看起来你正在尝试做的是保存会话变量以便以后继续所述会话。对于那项任务,你无法做任何事情来保存那些由于其性质而无法保存的对象。

最简单的解决方案就是忽略它们。用一些"存根替换它们"任何时候你用它们做任何事都会产生错误没有意义,因为一个缺失的变量无论如何都会产生错误(如果它掩盖了一个全局变量它就会胜出,但这本身就是一个可疑的做法)。

或者,您可以在还原会话时重新设置这些对象。但这种逻辑必然是针对任务的。

最后,例如IPython already has session saving/restoration logic,所以你可能根本不需要重新发明轮子。