python中断响应_Python手动中断(Ctrl-C)多线程程序

本文探讨了Python中多线程程序如何正确响应Ctrl-C中断,通过实例展示了Python2和Python3在处理中断时的不同行为。通过设置子线程为daemon线程并结合isAlive()方法,实现了一个能在接收到键盘中断时停止子线程的解决方案。
摘要由CSDN通过智能技术生成

灵感来源依旧是爬虫框架项目pycrawler,爬虫作为子线程运行时不受键盘中断信号影响,Ctrl-C无法终止整个爬虫运行。另外的一个场景是多线程压力测试,需要提前终止的情况下,Ctrl-C依旧不能终止整个程序。除了简单粗暴的使用kill命令强行终止之外,本文将给出一个简单可行的解决方案。

值得注意的一点是,Python2、3两个版本在测试中的表现并不一致,所以使用两个版本分别进行测试。

博客原文

测试环境Python2 2.7.9

Python3 3.4.2

Mac OS X Yosemite 10.10.3

子线程类import timefrom threading import Threadclass CountDown(Thread):

def __init__(self):

super(CountDown, self).__init__()    def run(self):

num = 100

print('slave start')        for i in range(10, 0, -1):

print('Num: {0}'.format(num/i))

time.sleep(1)

print('slave end')

失败情况一

主线程代码if __name__ == '__main__':

print('main start')

CountDown().start()

print('main end')

使用Python2进行测试,在运行结束之前手动终止:main start

slave start

main end

Num: 10Num: 11^CNum: 12Num: 14Num: 16Num: 20Num: 25Num: 33Num: 50Num: 100slave end

Exception KeyboardInterrupt in  ignored

可以看到,运行到第三行时手动终止,主线程已经提前结束,子线程继续执行直到结束,然后抛出未捕获异常,值得注意的是,此时没有Traceback输出。

接下来使用Python3测试同样的代码:main start

slave start

main end

Num: 10.0Num: 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值