我正在编写一个将启动本地文件服务器的python脚本,当该服务器处于活动状态时,它将每隔30秒写入一个文件。我想让服务器和编写器函数同步运行所以我使编写器函数成为一个守护程序线程...我的主要问题是,因为这个守护程序线程将在服务器停止后退出,如果守护程序正在写入到文件后它会在退出之前完成该操作吗?留下1/2文件是非常糟糕的。这是代码,但它要编写的实际文件大约是3k行JSON,因此引起关注。
applicationVariants.all { variant ->
if (variant.getBuildType().isMinifyEnabled()) {
variant.assemble.doLast {
copy {
from variant.mappingFile
into "${rootDir}/proguardTools"
rename { String fileName ->
"mapping-${variant.name}.txt"
}
}
}
}
}
答案 0 :(得分:1)
看起来你可能做出了一个错误的决定,使作家线程守护
制作守护线程并不意味着它将同步运行。它仍然会受到GIL的影响
如果您想要同步执行,则必须使用multiprocessing
来自Python文档:
守护程序线程在关闭时突然停止。他们的资源(如此 作为打开文件,数据库事务等)可能不会被释放 正常。如果你想让你的线程优雅地停止,那就制作它们吧 非守护进程并使用合适的信令机制,例如
Event
。
这意味着守护程序线程仅适用于仅在主线程的上下文中有意义的任务,并且在主线程停止工作时不重要。文件I / O,特别是数据保存,不适用于守护程序线程。
因此看起来最明显和最合乎逻辑的解决方案是使编写器线程非守护进程 然后,即使主线程退出,Python进程也不会结束,直到所有非守护线程完成为止。这允许文件I / O完成并安全退出。
可以在here
中找到Python中守护线程的说明