首页 > 解决方案 > Python线程类对象并通过pickle存储

问题描述

在 Python 中,我一直在使用线程从我的主脚本执行管道:

thread = PipeLine(input)
thread.daemon = True
thread.start()
result = thread.join()

我在另一个脚本中的类对象如下所示:

class PipeLine(threading.Thread):
    def __init__(self, input=()):
...

我在 GUI 中调用此代码,因此在进程繁忙时使用守护线程似乎是保持 GUI 可操作的好主意。但是,我还想在线程完成后用 pickle 以某种方式存储 Pipeline 类对象。这是我之前使用的代码。

pipeline = PipeLine(input)
with open(PATHOUT+subj_name+"\\PIPELINE", "wb" ) as f:
    pickle.dump(pipeline, f)  

如何在 Python 3 中实现这一点而不改变我拥有的太多东西?

谢谢

标签: pythonmultithreadingobjectpickle

解决方案


首先,一两个注释。在您的代码中,您有:

thread = PipeLine(input)
                thread.daemon = True
                thread.start()
                result = thread.join()
  1. 压痕明显关闭。
  2. result = thread.join()-> 方法 join() 总是返回None. 您在寻找什么类型的结果?你为什么要调用join()一个守护线程?守护线程的全部意义在于,程序在没有非守护线程时存在,因此不必终止守护线程即可退出程序。
  3. 您的论点的名称是input. 您应该尽量避免使用内置函数名称。

由于它是一个守护线程,其目的是让它一直运行到程序终止。但是当它是一个守护线程时,线程永远不会在正常意义上“完成”;它一直运行到没有非守护线程可用,然后被杀死。它持有的资源没有被释放,它的当前状态有些不确定。此时无法存储守护进程的线程状态。有人会认为可以向Pipeline类中添加一个__del__析构函数,该析构函数在线程被垃圾收集时执行酸洗操作,但是对于守护线程永远不会发生垃圾收集。

如果要在Pipeline对象终止后对其进行腌制,则它必须是在主线程终止时加入的非守护线程。您需要让Pipeline线程能够检查“停止条件”,以便它run以某种一致的状态从其方法返回,这样join来自主线程的调用就不会挂起。


推荐阅读