python - 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 中实现这一点而不改变我拥有的太多东西?
谢谢
解决方案
首先,一两个注释。在您的代码中,您有:
thread = PipeLine(input)
thread.daemon = True
thread.start()
result = thread.join()
- 压痕明显关闭。
result = thread.join()
-> 方法 join() 总是返回None
. 您在寻找什么类型的结果?你为什么要调用join()
一个守护线程?守护线程的全部意义在于,程序在没有非守护线程时存在,因此不必终止守护线程即可退出程序。- 您的论点的名称是
input
. 您应该尽量避免使用内置函数名称。
由于它是一个守护线程,其目的是让它一直运行到程序终止。但是当它是一个守护线程时,线程永远不会在正常意义上“完成”;它一直运行到没有非守护线程可用,然后被杀死。它持有的资源没有被释放,它的当前状态有些不确定。此时无法存储守护进程的线程状态。有人会认为可以向Pipeline
类中添加一个__del__
析构函数,该析构函数在线程被垃圾收集时执行酸洗操作,但是对于守护线程永远不会发生垃圾收集。
如果要在Pipeline
对象终止后对其进行腌制,则它必须是在主线程终止时加入的非守护线程。您需要让Pipeline
线程能够检查“停止条件”,以便它run
以某种一致的状态从其方法返回,这样join
来自主线程的调用就不会挂起。
推荐阅读
- sql - SQL query : Need to display the list of orders made by clients ordered by the date of the first order of a client
- javascript - JavaScript:Selenium:如何获取待处理的 xhr 请求的总数?
- r - 在 R 中使用 ggplot 在条形图中显示数据中不存在的级别
- javascript - 反应如何在输入模糊时触发表单提交?
- zpl - 打印时 A0N 尺寸与预期不同
- python - 如何更改 ttk.OptionMenu 的字体?
- amazon-web-services - 如何向 API 请求添加 Cognito 授权?以便 Lambdas 可以访问它
- java - 如何仅从数组中的父节点获取文本
- python-3.x - AttributeError:“NoneType”对象没有属性“isnull”
- php - 如何解决临时站点上的“致命错误:内存不足”问题?