请教主线程不结束时怎么结束子线程 ?

2016-09-16 16:18:40 +08:00
 longchisihai
我有一个主线程,不断的去循环判断某个目录是否有文件,一旦有文件,则创建多线程把这些文件全部挪到另外的地方。而目前存在的问题是,由于这个主线程是永远不退出的,导致创建的子线程越来越多,子线程占用的内存也越来越多,有什么好的办法结束子线程吗?
3317 次点击
所在节点    Python
16 条回复
pagxir
2016-09-16 16:21:37 +08:00
需要做子线程的 join/detach 。
wizardforcel
2016-09-16 16:36:32 +08:00
如果不需要控制子线程,创建之后应该立即 detach 。
longchisihai
2016-09-16 16:49:24 +08:00
@wizardforcel
threading 模块没有 detach 方法呀,怎么 detach 呢?
raysonx
2016-09-16 16:49:36 +08:00
我从另外的角度谈一谈这个问题。
1.理想的方式是子线程完成任务后主动退出,如果子线程工作期间被不明真相的主线程强制杀死,可能会产生无法预知的行为。
2.主线程不断创建子线程不是一个好的策略,因为机器的硬件资源有限,同时创建大量线程反而降低运行效率。建议维护一份任务队列和线程池,由线程池中的线程从任务队列取任务。
3.你的主线程要能保证不能创建重复任务。
raysonx
2016-09-16 16:53:51 +08:00
detach 线程通常只是为了让线程退出后资源会被自动回收。
如果你不加节制地创建线程的话,问题依然不会得到解决。
raysonx
2016-09-16 17:00:07 +08:00
再一个题外话,如果程序跑在 Linux 上,还可以尝试用 dnotify 和 inotify 让内核主动告知文件系统变化,避免用循环手动扫描
wangxiaoer
2016-09-16 18:44:55 +08:00
你这完全是 XY problem( http://mywiki.wooledge.org/XyProblem) .

@raysonx 已经提到了,合理的做法是子进程自己根据某些 flag 控制进程是否结束,并且有责任在退出前释放自己占用的资源
Knights
2016-09-16 18:58:35 +08:00
如果主线程可以阻塞的话就在主线程里移动文件吧,不能阻塞的话试试异步。
techmoe
2016-09-16 19:01:46 +08:00
4 楼正解,感觉这个逻辑设计的有缺陷
可以考虑像一些下载器一样设置最大同时删除(下载)数这种功能
davy1995
2016-09-16 19:05:27 +08:00
线程池?
missdeer
2016-09-16 19:23:08 +08:00
4 楼正解
子线程为什么不自己结束退出?
频繁创建新的线程不如用线程池。
longchisihai
2016-09-16 19:36:01 +08:00
感谢大家的回复!
reus
2016-09-16 19:45:52 +08:00
用 go ,监视文件夹、并行移动、限制并行数量都有了
https://gist.github.com/reusee/cc61fbbcd9229a89ad01cbb6ed97987e
alqaz
2016-09-16 19:48:57 +08:00
发信号
wizardforcel
2016-09-16 21:55:59 +08:00
不如这样,创建固定数量的线程,并使用 threading 模块的 queue ,主线程扫描文件之后存进 queue 里面,子线程循环读取 queue ,如果没有内容就 sleep ,有内容就处理。
8bit
2016-09-17 19:32:12 +08:00
这不是生产者与消费者问题吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/306606

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX