python 退出程序_Python:用Ctrl+C解决终止多线程程序的问题!(建议收藏)
前言:
今天為大家?guī)淼膬?nèi)容是Python:用Ctrl+C解決終止多線程程序的問題!文章中的代碼具有不錯的參考意義,希望在此能夠幫助到各位!(多數(shù)代碼用圖片的方式呈現(xiàn)出來,方便各位觀看與收藏)
出發(fā)點:
前段時間,花了一天時間用python為服務(wù)寫了個壓力測試。很簡單,多線程向服務(wù)器發(fā)請求。但寫完之后發(fā)現(xiàn)如果中途想停下來,按Ctrl+C達不到效果,自然想到要用信號處理函數(shù)捕捉信號,使線程都停下來,問題解決的方法請往下看:
代碼如下:
在這里提示一句:上面是一個模擬程序,并不真正向服務(wù)發(fā)送請求。
而代之以在一千萬以內(nèi),每個線程每隔并發(fā)數(shù)個(cc個)打印一個整數(shù)。很明顯,當(dāng)所有線程都完成自己的任務(wù)后,進程會正常退出。但如果我們中途想退出(試想一個壓力測試程序,在中途已經(jīng)發(fā)現(xiàn)了問題,需要停止測試),該腫么辦?
你當(dāng)然可以用ps查找到進程號,然后kill -9殺掉,但這樣太繁瑣了,捕捉Ctrl+C是最自然的想法。上面示例程序中已經(jīng)捕捉了這個信號,并修改全局變量is_exit,線程中會檢測這個變量,及時退出。
但事實上這個程序并不work,當(dāng)你按下Ctrl+C時,程序照常運行,并無任何響應(yīng)。網(wǎng)上搜了一些資料,明白是python的子線程如果不是daemon的話,主線程是不能響應(yīng)任何中斷的。但設(shè)為daemon后主線程會隨之退出,接著整個進程很快就退出了,所以還需要在主線程中檢測各個子線程的狀態(tài),直到所有子線程退出后自己才退出,因此上例29行之后的代碼可以修改為:
代碼如下:
重新試一下,問題依然沒有解決,進程還是沒有響應(yīng)Ctrl+C,這是因為join()函數(shù)同樣會waiting在一個鎖上,使主線程無法捕獲信號。因此繼續(xù)修改,調(diào)用線程的isAlive()函數(shù)判斷線程是否完成:
代碼如下:
while 1: alive = False for i in range(cc): alive = alive or threads[i].isAlive() if not alive: break注意:這樣修改后,程序完全按照預(yù)想運行了:可以順利的打印每個線程應(yīng)該打印的所有數(shù)字,也可以中途用Ctrl+C終結(jié)整個進程。
完整的代碼如下:
提示:圖一,二,三中的代碼都是一起的!
其實,如果用python寫一個服務(wù),也需要這樣,因為負責(zé)服務(wù)的那個線程是永遠在那里接收請求的,不會退出,而如果你想用Ctrl+C殺死整個服務(wù),跟上面的壓力測試程序是一個道理。總結(jié)一下,python多線程中要響應(yīng)Ctrl+C的信號以殺死整個進程,需要:
1.把所有子線程設(shè)為Daemon;
2.使用isAlive()函數(shù)判斷所有子線程是否完成,而不是在主線程中用join()函數(shù)等待完成;
3.寫一個響應(yīng)Ctrl+C信號的函數(shù),修改全局變量,使得各子線程能夠檢測到,并正常退出。
以上就是本文的全部內(nèi)容啦!
小編在這里說句:我是一名python開發(fā)工程師,最近翻了以前的筆記,總結(jié)了工作這么久的經(jīng)驗,共整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機器學(xué)習(xí),面試寶典,面試寶典,面試寶典。想要這些資料的可以關(guān)注小編,并在后臺私信小編:“07”即可領(lǐng)取
總結(jié)
以上是生活随笔為你收集整理的python 退出程序_Python:用Ctrl+C解决终止多线程程序的问题!(建议收藏)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python调用ctypes中windl
- 下一篇: WorkList-Dicom字段定义