首页
学习
活动
专区
工具
TVP
发布

Python多线程怎样优雅的响应中断异常

最近需求做完没什么事干,就爬了点知乎的话题数据,用到了多个线程。遇到一个问题:

当我们手动时,怎样把子线程都停掉呢?

先说几个知识点:

Ctrl+C 引起的任意线程都能收到。但是当系统存在模块时,中断只会发到主线程。

锁的操作不会被中断,在获得锁之后才会抛出异常。

主线程因异常退出后,一般情况下,剩下所有的子线程也会被系统杀掉,并且不会执行完整的操作。

一般的系统都是有signal模块的,所以键盘中断异常一般只能由主线程处理。

下面我们开10个线程模拟爬去数据,在主线程捕获该异常:

运行后,按下,发现控制台打印了之后,其他的10个子线程并没有停止而是继续在运行。

第三条不是说主线程退出后所有的子线程会被系统杀掉吗?

答案是主线程在捕获中断、执行完打印操作后并没有退出,而是在等待子线程退出,更改方法:

重新运行,按下,会发现打印出激活状态的线程数是11,也就验证了主线程并没有退出,所以子线程会继续运行下去。

那怎样停止所有的子线程呢?

引入模块的类:

代码中引入了一个类型哨兵对象,这个对象的、和方法都是线程安全的。

在线程的循环体中我们不断的判断该对象是否被设置过,如果没有则马上退出

在主线程捕获到中断异常时将该对象清空

这样程序运行起来后,当按下时,主线程和子线程都会马上停止下来。

知乎话题数据

开头说到的爬虫,我是反编译了知乎的app和手机抓包找到了一些客户端话题相关的api,然后花了一天的时间把知乎所有的话题数据撸了下来。统计下来知乎目前共计有44618个话题,其中有5000+个”未归类”话题。

关注用户最多的10个话题:

问题最多的10个话题:

接下来准备根据这些话题把所有用户信息都给撸一遍,没有代理真是个硬伤,爬得太快分分钟被封ip、封账号,各位又好用的代理推荐下啊~~~

EOF

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171229G05S4D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券