网站建设 中企动力北京,杭州有做网站,30个适合大学生创业的项目,软件开发的一般流程前言#xff1a;今天为大家带来的内容是Python:用CtrlC解决终止多线程程序的问题#xff01;文章中的代码具有不错的参考意义#xff0c;希望在此能够帮助到各位#xff01;(多数代码用图片的方式呈现出来#xff0c;方便各位观看与收藏)出发点#xff1a;前段时间#…前言今天为大家带来的内容是Python:用CtrlC解决终止多线程程序的问题文章中的代码具有不错的参考意义希望在此能够帮助到各位(多数代码用图片的方式呈现出来方便各位观看与收藏)出发点前段时间花了一天时间用python为服务写了个压力测试。很简单多线程向服务器发请求。但写完之后发现如果中途想停下来按CtrlC达不到效果自然想到要用信号处理函数捕捉信号使线程都停下来问题解决的方法请往下看代码如下:在这里提示一句上面是一个模拟程序并不真正向服务发送请求。而代之以在一千万以内每个线程每隔并发数个(cc个)打印一个整数。很明显当所有线程都完成自己的任务后进程会正常退出。但如果我们中途想退出(试想一个压力测试程序在中途已经发现了问题需要停止测试)该肿么办你当然可以用ps查找到进程号然后kill -9杀掉但这样太繁琐了捕捉CtrlC是最自然的想法。上面示例程序中已经捕捉了这个信号并修改全局变量is_exit线程中会检测这个变量及时退出。但事实上这个程序并不work当你按下CtrlC时程序照常运行并无任何响应。网上搜了一些资料明白是python的子线程如果不是daemon的话主线程是不能响应任何中断的。但设为daemon后主线程会随之退出接着整个进程很快就退出了所以还需要在主线程中检测各个子线程的状态直到所有子线程退出后自己才退出因此上例29行之后的代码可以修改为代码如下:重新试一下问题依然没有解决进程还是没有响应CtrlC这是因为join()函数同样会waiting在一个锁上使主线程无法捕获信号。因此继续修改调用线程的isAlive()函数判断线程是否完成 代码如下:while 1: alive False for i in range(cc): alive alive or threads[i].isAlive() if not alive: break注意这样修改后程序完全按照预想运行了可以顺利的打印每个线程应该打印的所有数字也可以中途用CtrlC终结整个进程。完整的代码如下提示图一二三中的代码都是一起的其实如果用python写一个服务也需要这样因为负责服务的那个线程是永远在那里接收请求的不会退出而如果你想用CtrlC杀死整个服务跟上面的压力测试程序是一个道理。总结一下python多线程中要响应CtrlC的信号以杀死整个进程需要1.把所有子线程设为Daemon2.使用isAlive()函数判断所有子线程是否完成而不是在主线程中用join()函数等待完成3.写一个响应CtrlC信号的函数修改全局变量使得各子线程能够检测到并正常退出。以上就是本文的全部内容啦小编在这里说句我是一名python开发工程师最近翻了以前的笔记总结了工作这么久的经验共整理了一套最新的python系统学习教程包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习,面试宝典面试宝典面试宝典。想要这些资料的可以关注小编并在后台私信小编“07”即可领取