當前位置:首頁 » 編程語言 » pythonctrlc

pythonctrlc

發布時間: 2023-02-10 22:20:34

python 怎麼讓程序接受ctrl + c終止信號

花了一天時間用python為服務寫了個壓力測試。很簡單,多線程向伺服器發請求。但寫完之後發現如果中途想停下來,按Ctrl+C達不到效果,自然想到要用信號處理函數捕捉信號,使線程都停下來,問題解決的方法請往下看:

復制代碼代碼如下:

#!/bin/env python
# -*- coding: utf-8 -*-
#filename: peartest.py

import threading, signal

is_exit = False

def doStress(i, cc):
global is_exit
idx = i
while not is_exit:
if (idx < 10000000):
print "thread[%d]: idx=%d"%(i, idx)
idx = idx + cc
else:
break
print "thread[%d] complete."%i

def handler(signum, frame):
global is_exit
is_exit = True
print "receive a signal %d, is_exit = %d"%(signum, is_exit)

if __name__ == "__main__":
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
cc = 5
for i in range(cc):
t = threading.Thread(target=doStress, args=(i,cc))
t.start()

上面是一個模擬程序,並不真正向服務發送請求,而代之以在一千萬以內,每個線程每隔並發數個(cc個)列印一個整數。很明顯,當所有線程都完成自己的任務後,進程會正常退出。但如果我們中途想退出(試想一個壓力測試程序,在中途已經發現了問題,需要停止測試),該腫么辦?你當然可以用ps查找到進程號,然後kill -9殺掉,但這樣太繁瑣了,捕捉Ctrl+C是最自然的想法。上面示常式序中已經捕捉了這個信號,並修改全局變數is_exit,線程中會檢測這個變數,及時退出。
但事實上這個程序並不work,當你按下Ctrl+C時,程序照常運行,並無任何響應。網上搜了一些資料,明白是python的子線程如果不是daemon的話,主線程是不能響應任何中斷的。但設為daemon後主線程會隨之退出,接著整個進程很快就退出了,所以還需要在主線程中檢測各個子線程的狀態,直到所有子線程退出後自己才退出,因此上例29行之後的代碼可以修改為:

復制代碼代碼如下:

threads=[]
for i in range(cc):
t = threading.Thread(target=doStress, args=(i, cc))
t.setDaemon(True)
threads.append(t)
t.start()
for i in range(cc):
threads[i].join()

重新試一下,問題依然沒有解決,進程還是沒有響應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終結整個進程。完整的代碼如下:

復制代碼代碼如下:

#!/bin/env python
# -*- coding: utf-8 -*-
#filename: peartest.py

import threading, signal

is_exit = False

def doStress(i, cc):
global is_exit
idx = i
while not is_exit:
if (idx < 10000000):
print "thread[%d]: idx=%d"%(i, idx)
idx = idx + cc
else:
break
if is_exit:
print "receive a signal to exit, thread[%d] stop."%i
else:
print "thread[%d] complete."%i

def handler(signum, frame):
global is_exit
is_exit = True
print "receive a signal %d, is_exit = %d"%(signum, is_exit)

if __name__ == "__main__":
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
cc = 5
threads = []
for i in range(cc):
t = threading.Thread(target=doStress, args=(i,cc))
t.setDaemon(True)
threads.append(t)
t.start()
while 1:
alive = False
for i in range(cc):
alive = alive or threads[i].isAlive()
if not alive:
break

其實,如果用python寫一個服務,也需要這樣,因為負責服務的那個線程是永遠在那裡接收請求的,不會退出,而如果你想用Ctrl+C殺死整個服務,跟上面的壓力測試程序是一個道理。總結一下,python多線程中要響應Ctrl+C的信號以殺死整個進程,需要:
1.把所有子線程設為Daemon;
2.使用isAlive()函數判斷所有子線程是否完成,而不是在主線程中用join()函數等待完成;
3.寫一個響應Ctrl+C信號的函數,修改全局變數,使得各子線程能夠檢測到,並正常退出。

② python 多線程ctrl+c不起作用

我這上不了網路網盤,沒法下載,看不了你的代碼。但是可以給你個解決思路,你可以寫把進程號傳出來,到時候外面有個程序來處理。ctrl C肯定是停不了的。
還有就是Python多線程涉及到線程安全,推薦你使用多進程。
nostmabole手打,望採納。

③ python中能否實現循環中ctrl+c跳出循環

try:
urllib2.urlopen(request)#你原來的執行<a href="https://www..com/s?wd=%E5%87%BD%E6%95%B0&tn=44039180_cpr&fenlei=-EUBtvnH6sP1RYrHcvnWcYrjT4n1c" target="_blank" class="-highlight">函數</a>。
except:
print 'wrong'

可以這樣寫跳過執行。

④ python怎麼粘貼代碼

python怎麼粘貼代碼?
復制
* 如果py文件,IDLE打開程序,選中要復制的內容後右鍵點擊「復制」(ctrl+c好像不行)
* 如果是其他,隨意
粘貼
* 打開python,右鍵即可,粘貼完成python不會關閉
* 或者打開cmd,右鍵點擊「粘貼」,粘貼完成cmd關閉
* ctrl+v均失效
疑問:復制的一段文字,打開python,右鍵可以粘貼。但如果是python桌面快捷方式,右鍵無法粘貼
推薦:《python教程》
以上就是小編分享的關於python怎麼粘貼代碼的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!

⑤ python怎麼復制粘貼

復制粘貼的方法:在IDE裡面滑鼠選中之後ctrl+c,ctrl+v。

⑥ python執行cmd命令,怎麼讓他執行類似Ctrl+C效果將其結束命令

python執行cmd命令,怎麼讓他執行Ctrl+C的效果結束命令?
我在用ping監控一個伺服器的網路狀態,我執行了ping命令後,他會一直這么ping下去,不停止,怎麼讓他在10秒後執行ctrl+c的效果
def re(cmd): while True:
os.system(cmd);re("ping 192.168.1.1 -t")

他會這樣一直ping下去,想了半天也想不出怎麼讓他10秒後執行ctrl+c結束的執行效果,請教大神,怎麼讓他執行結束命令;
10秒後停止命令,類似執行ctrl+c的效果;
[root@jenkins xxxx]# time ping .com -w 10s
PING .com (220.181.57.217) 56(84) bytes of data.64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=1 ttl=52 time=4.07 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=2 ttl=52 time=26.9 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=3 ttl=52 time=6.78 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=4 ttl=52 time=12.9 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=5 ttl=52 time=3.86 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=6 ttl=52 time=3.30 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=7 ttl=52 time=5.63 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=8 ttl=52 time=11.2 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=9 ttl=52 time=4.30 ms64 bytes from 220.181.57.217 (220.181.57.217): icmp_seq=10 ttl=52 time=4.17 ms

--- .com ping statistics ---10 packets transmitted, 10 received, 0% packet loss, time 9013ms
rtt min/avg/max/mdev = 3.300/8.328/26.972/6.954 ms

real 0m10.006s
user 0m0.003s
sys 0m0.006s

不知道能不能滿足你的需求

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:582
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:876
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:571
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:757
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:673
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1000
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:244
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:103
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:795
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:701