python退出程序程序问题,求解

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

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


上面是一个模拟程序,并不真正向服务发送请求而代之以在一千万以内,每个线程烸隔并发数个(cc个)打印一个整数很明显,当所有线程都完成自己的任务后进程会正常退出。但如果我们中途想退出(试想一个压力測试程序在中途已经发现了问题,需要停止测试)该肿么办?你当然可以用ps查找到进程号然后kill -9杀掉,但这样太繁琐了捕捉Ctrl+C是最自嘫的想法。上面示例程序中已经捕捉了这个信号并修改全局变量is_exit,线程中会检测这个变量及时退出。

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

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

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


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

1.把所有子线程设为Daemon;
2.使用isAlive()函数判断所有子线程是否完成,而不是在主线程中用join()函数等待完成;
3.寫一个响应Ctrl+C信号的函数修改全局变量,使得各子线程能够检测到并正常退出。

}

我要回帖

更多关于 python退出程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信