繁体   English   中英

Python线程类对象并通过pickle存储

[英]Python thread class object and storing via 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 中实现这一点而不改变我拥有的太多?

谢谢

首先,一两个笔记。 在您的代码中,您有:

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

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

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

感谢您的有益评论。 我通过简单地调用使转储成为函数的一部分然后将该函数作为目标调用来解决这个问题。 这样,数据就已经在主函数的启动过程中转储了。 还注意到您对使用输入的评论,我会修改它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM