前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python多线程怎样优雅的响应中断异常

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

作者头像
企鹅号小编
发布2018-01-15 11:53:19
1.7K0
发布2018-01-15 11:53:19
举报
文章被收录于专栏:编程编程

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

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

先说几个知识点:

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

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

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

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

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

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

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

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

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

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

引入模块的类:

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

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

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

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

知乎话题数据

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

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

问题最多的10个话题:

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

EOF

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档