前言:

今天为大家带来的内容是Python:用Ctrl+C解决终止多线程程序的问题!文章中的代码具有不错的参考意义,希望在此能够帮助到各位!(多数代码用图片的方式呈现出来,方便各位观看与收藏)

出发点:

前段时间,花了一天时间用python为服务写了个压力测试。很简单,多线程向服务器发请求。但写完之后发现如果中途想停下来,按Ctrl+C达不到效果,自然想到要用信号处理函数捕捉信号,使线程都停下来,问题解决的方法请往下看:

代码如下:

在这里提示一句:上面是一个模拟程序,并不真正向服务发送请求。

而代之以在一千万以内,每个线程每隔并发数个(cc个)打印一个整数。很明显,当所有线程都完成自己的任务后,进程会正常退出。但如果我们中途想退出(试想一个压力测试程序,在中途已经发现了问题,需要停止测试),该肿么办?

你当然可以用ps查找到进程号,然后kill -9杀掉,但这样太繁琐了,捕捉Ctrl+C是最自然的想法。上面示例程序中已经捕捉了这个信号,并修改全局变量is_exit,线程中会检测这个变量,及时退出。

但事实上这个程序并不work,当你按下Ctrl+C时,程序照常运行,并无任何响应。网上搜了一些资料,明白是python的子线程如果不是daemon的话,主线程是不能响应任何中断的。但设为daemon后主线程会随之退出,接着整个进程很快就退出了,所以还需要在主线程中检测各个子线程的状态,直到所有子线程退出后自己才退出,因此上例29行之后的代码可以修改为:

代码如下:

重新试一下,问题依然没有解决,进程还是没有响应Ctrl+C,这是因为join()函数同样会waiting在一个锁上,使主线程无法捕获信号。因此继续修改,调用线程的isAlive()函数判断线程是否完成:

代码如下:

while 1: alive = False for i in range(cc): alive = alive or threads[i].isAlive() if not alive: break

注意:这样修改后,程序完全按照预想运行了:可以顺利的打印每个线程应该打印的所有数字,也可以中途用Ctrl+C终结整个进程。

完整的代码如下:

提示:图一,二,三中的代码都是一起的!

其实,如果用python写一个服务,也需要这样,因为负责服务的那个线程是永远在那里接收请求的,不会退出,而如果你想用Ctrl+C杀死整个服务,跟上面的压力测试程序是一个道理。总结一下,python多线程中要响应Ctrl+C的信号以杀死整个进程,需要:

1.把所有子线程设为Daemon;

2.使用isAlive()函数判断所有子线程是否完成,而不是在主线程中用join()函数等待完成;

3.写一个响应Ctrl+C信号的函数,修改全局变量,使得各子线程能够检测到,并正常退出。

以上就是本文的全部内容啦!

小编在这里说句:我是一名python开发工程师,最近翻了以前的笔记,总结了工作这么久的经验,共整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习,面试宝典,面试宝典,面试宝典。想要这些资料的可以关注小编,并在后台私信小编:“07”即可领取

python 退出程序_Python:用Ctrl+C解决终止多线程程序的问题!(建议收藏)相关推荐

  1. Python机器学习、深度学习库总结(内含大量示例,建议收藏)

    Python机器学习.深度学习库总结(内含大量示例,建议收藏) 前言 python常用机器学习及深度学习库介绍 总结与分类 python 常用机器学习及深度学习库总结 分类 更多 前言 目前,随着人工 ...

  2. python except用法和作用_Python面试题(部分附带面试标准答案) 建议收藏

    1.请尽可能列举python列表的成员方法,并给出一下列表操作的答案: (1) a=[1, 2, 3, 4, 5], a[::2]=?, a[-2:] = ? (2) 一行代码实现对列表a中的偶数位置 ...

  3. python 多线程处理_Python中的多处理与多线程:您需要了解的内容。

    python 多线程处理 by Timber.io 由Timber.io Python中的多处理与多线程:您需要了解的内容. (Multiprocessing vs Multithreading in ...

  4. python gui界面设置数据储存在哪里_我整理的一些常用Python库!让你快速记住这些库的用法!建议收藏...

    Python的一大特色是其丰富的模块,基本上只要你能想到的常见的开发需求,都能找到别人已经实现的库直接使用,或者相关工具或则框架来辅助实现.但这对于新人来说也是一个问题:这么多库,我要从哪里学起?怎样 ...

  5. 精心收集汇总的Python学习资源(书籍+工具+视频),强烈建议收藏!

    python是一种被广泛使用的高级编程语言,其代码语法简洁.可读性强,并且具有丰富和强大的库. python简单易学,应用广泛,web开发.爬虫.运维.人工智能--可以说无所不能.python还被列入 ...

  6. python 写入excel 日期_详解:Python实现大数据收集至excel的思路大牛分享(建议收藏)...

    一.在工程目录中新建一个excel文件 二.使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询 三.以下code内容为:实现从接口获取到的数据值写入 ...

  7. Python3,我用这种方式讲解python模块,80岁的奶奶都说能理解。建议收藏 ~ ~

    Python模块讲解 1.引言 2.python模块详解 2.1 含义 2.2 代码示例 2.3 进阶 3.总结 1.引言 小屌丝:鱼哥,你看天上的月亮越来越圆了. 小鱼:唉~ 又是一年团圆夜,又是一 ...

  8. 用python兼职实现经济独立,附接单所有途径,建议收藏

    这是本文的目录 前言 一.程序员接活.新手接,需知: 二.这几种单要注意 三.接单方式 1.通过平台接单 2.通过一些群接单 3.编程老师 四.抓取数据 最后 零基础Python学习资源介绍

  9. python守护线程错误 退出子线程_请问用python里threading和queue模块来写多线程程序,子线程是如何结束的?...

    import queue import threading class Consumer(threading.Thread): def __init__(self, queue): threading ...

最新文章

  1. python考试pass or fail_请问老师为什么我输入的数据,预期结果是pass,我的预期因该是“fail”...
  2. bzoj2440: [中山市选2011]完全平方数
  3. php windows应用开发,开发老手谈Windows平台的PHP应用开发
  4. 提高mysql查询速度_如何提高数据库查询速度
  5. 利用iframe无刷新上传文件的坑
  6. java的svn插件maver_eclipse中 svn插件导入maven项目
  7. ncbi查找目的基因序列_NCBI gene: 基因相关信息查询
  8. CentOS配置Nginx官方的Yum源 及yum安装php
  9. 画图软件Microsoft visio下载安装及使用
  10. 北京市市级行政区界线
  11. 吊打本地搜索神器everthing,最快 最强的电脑本地搜索神器!
  12. 国科大高级软件工程20年期末考题
  13. 按着Phoenix Framework文档练个手,感受一下Elixir语言。
  14. 配置华为防火墙安全策略
  15. 电子健康档案:实现医疗信息的有效共享
  16. HTML5 CSS3 生日快乐动画网页(粉红色的回忆)
  17. 做个全栈工程师真的好吗?
  18. 3D深度相机---结构光
  19. windows资源保护无法启动修复服务器,win10专业版sfc/scannow修复系统提示windows资源保护没法启动修复服务?...
  20. 怎么申请企业电子邮箱?TOM企业邮箱注册电子邮件流程详解

热门文章

  1. 【转】Vector与ArrayList区别
  2. 判断图有无环_浅谈什么是图拓扑排序
  3. mac idea在mybatis xml文件里引入全限定类名报红解决
  4. Git服务器报错:host key for (ip地址) has changed and you have requested strict checking
  5. 通过福禄克测试仪进行数据中心机房各个区域的测试或认证
  6. GitHub上13个学习资源项目,值得收藏!
  7. 数据库:计算地球上两个坐标点之间里程
  8. 程序员最反感的十件事,你有同感吗?
  9. linux kafka离线安装,centos 离线安装confluent_kafka 模块
  10. 职坐标 MySQL视频_测试工具之MySQLSlap使用实例