python - 在线程之间共享对象时如何避免 pickle 错误?

标签 python multithreading pickle locks

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

相关文章:

python - 如何将字典列表转换为....?

python - 如何拉伸(stretch) pandas 中列的长度值?

java - 如何在Java中创建多个线程?

python - "shelve"只是 "dbm"和 "pickle"的组合吗?

python - 将popen输出重定向到python中的文件

C# DispatcherOperation 循环永不中断

c++ - WINAPI CreateThread 并不总是运行线程

python - 在 Python 中序列化/反序列化类对象的最佳方法是什么?

python - pickle set 的子类时未调用 __getstate__ 方法

python - 使用 flask 设置 coverage.py