最近需求做完没什么事干,就爬了点知乎的话题数据,用到了多个线程。遇到一个问题:
当我们手动时,怎样把子线程都停掉呢?
先说几个知识点:
Ctrl+C 引起的任意线程都能收到。但是当系统存在模块时,中断只会发到主线程。
锁的操作不会被中断,在获得锁之后才会抛出异常。
主线程因异常退出后,一般情况下,剩下所有的子线程也会被系统杀掉,并且不会执行完整的操作。
一般的系统都是有signal模块的,所以键盘中断异常一般只能由主线程处理。
下面我们开10个线程模拟爬去数据,在主线程捕获该异常:
运行后,按下,发现控制台打印了之后,其他的10个子线程并没有停止而是继续在运行。
第三条不是说主线程退出后所有的子线程会被系统杀掉吗?
答案是主线程在捕获中断、执行完打印操作后并没有退出,而是在等待子线程退出,更改方法:
重新运行,按下,会发现打印出激活状态的线程数是11,也就验证了主线程并没有退出,所以子线程会继续运行下去。
那怎样停止所有的子线程呢?
引入模块的类:
代码中引入了一个类型哨兵对象,这个对象的、和方法都是线程安全的。
在线程的循环体中我们不断的判断该对象是否被设置过,如果没有则马上退出
在主线程捕获到中断异常时将该对象清空
这样程序运行起来后,当按下时,主线程和子线程都会马上停止下来。
知乎话题数据
开头说到的爬虫,我是反编译了知乎的app和手机抓包找到了一些客户端话题相关的api,然后花了一天的时间把知乎所有的话题数据撸了下来。统计下来知乎目前共计有44618个话题,其中有5000+个”未归类”话题。
关注用户最多的10个话题:
问题最多的10个话题:
接下来准备根据这些话题把所有用户信息都给撸一遍,没有代理真是个硬伤,爬得太快分分钟被封ip、封账号,各位又好用的代理推荐下啊~~~
EOF
本文来自企鹅号 - 全球大搜罗媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - 全球大搜罗媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有