1
pagxir 2016-09-16 16:21:37 +08:00 via Android
需要做子线程的 join/detach 。
|
2
wizardforcel 2016-09-16 16:36:32 +08:00 via Android
如果不需要控制子线程,创建之后应该立即 detach 。
|
3
longchisihai OP @wizardforcel
threading 模块没有 detach 方法呀,怎么 detach 呢? |
4
raysonx 2016-09-16 16:49:36 +08:00 via iPad 1
我从另外的角度谈一谈这个问题。
1.理想的方式是子线程完成任务后主动退出,如果子线程工作期间被不明真相的主线程强制杀死,可能会产生无法预知的行为。 2.主线程不断创建子线程不是一个好的策略,因为机器的硬件资源有限,同时创建大量线程反而降低运行效率。建议维护一份任务队列和线程池,由线程池中的线程从任务队列取任务。 3.你的主线程要能保证不能创建重复任务。 |
5
raysonx 2016-09-16 16:53:51 +08:00 via iPad
detach 线程通常只是为了让线程退出后资源会被自动回收。
如果你不加节制地创建线程的话,问题依然不会得到解决。 |
6
raysonx 2016-09-16 17:00:07 +08:00 via iPad
再一个题外话,如果程序跑在 Linux 上,还可以尝试用 dnotify 和 inotify 让内核主动告知文件系统变化,避免用循环手动扫描
|
7
wangxiaoer 2016-09-16 18:44:55 +08:00
你这完全是 XY problem( http://mywiki.wooledge.org/XyProblem) .
@raysonx 已经提到了,合理的做法是子进程自己根据某些 flag 控制进程是否结束,并且有责任在退出前释放自己占用的资源 |
8
Knights 2016-09-16 18:58:35 +08:00 via iPad
如果主线程可以阻塞的话就在主线程里移动文件吧,不能阻塞的话试试异步。
|
9
techmoe 2016-09-16 19:01:46 +08:00 via Android
4 楼正解,感觉这个逻辑设计的有缺陷
可以考虑像一些下载器一样设置最大同时删除(下载)数这种功能 |
10
davy1995 2016-09-16 19:05:27 +08:00 via Android
线程池?
|
11
missdeer 2016-09-16 19:23:08 +08:00
4 楼正解
子线程为什么不自己结束退出? 频繁创建新的线程不如用线程池。 |
12
longchisihai OP 感谢大家的回复!
|
13
reus 2016-09-16 19:45:52 +08:00
用 go ,监视文件夹、并行移动、限制并行数量都有了
https://gist.github.com/reusee/cc61fbbcd9229a89ad01cbb6ed97987e |
14
alqaz 2016-09-16 19:48:57 +08:00 via Android
发信号
|
15
wizardforcel 2016-09-16 21:55:59 +08:00
不如这样,创建固定数量的线程,并使用 threading 模块的 queue ,主线程扫描文件之后存进 queue 里面,子线程循环读取 queue ,如果没有内容就 sleep ,有内容就处理。
|
16
8bit 2016-09-17 19:32:12 +08:00
这不是生产者与消费者问题吗?
|