python 怎么让程序接受ctrl + c终止讯号

举报 回答
python 怎么让程序接受ctrl + c终止讯号
问在线客服
扫码问在线客服
  • 回答数

    5

  • 浏览数

    6,364

举报 回答

5个回答 默认排序
  • 默认排序
  • 按时间排序

没找到满意答案?去问秘塔AI搜索
取消 复制问题
已采纳
哎哟,昨天肝了一天Python写了个压测小脚本,就是多线程狂轰服务器那种~
结果发现!按Ctrl+C根本停不下来!!急得我直挠头
本来想着加个signal捕获SIGINT,改个全局flag让线程自己check退出,美滋滋~
结果一试——Ctrl+C按烂了,程序纹丝不动,还在那儿吭哧吭哧跑…(气抖冷)
搜了一圈才懂:Python里非守护线程(non-daemon thread)会把主线程拽住,信号根本进不来!
你设成daemon吧?更坑——主线程一收工,所有子线程直接被掐断,脚本闪退,日志都来不及打
最后整明白了:得双管齐下!
? 子线程设成 daemon(不然卡死)
? 主线程不能躺平,得主动等所有子线程跑完再退(不然全被强杀)
? signal照加,flag照改,但退出逻辑得兜住!
附上修好的精简版(已去注释&乱码,能直接跑):
python
!/usr/bin/env python
-*- coding: utf-8 -*-
import threading, signal, time
is_exit = False
def doStress(i, cc):
global is_exit
idx = i
while not is_exit:
if idx 10000000:
print(fthread {i}: idx={idx})
idx += cc
else:
break
print(fthread {i} done.)
def handler(signum, frame):
global is_exit
is_exit = True
print(fn?? 收到信号 {signum},准备优雅退出...)
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) 关键!不加这句Ctrl+C无效
t.start()
threads.append(t)

主线程不退出,等着所有子线程自然结束
for t in threads:
t.join() 这句不能少!否则主线程秒退,子线程被屠
print(? 全部线程已退出,压测结束!)

总结一句话:
想Ctrl+C停压测?daemon + join + signal 缺一不可!
(别问,问就是踩过坑的过来人)
取消 评论
应该不是win8的问题,线程在select.select那里阻塞了吧,试试多线程?
取消 评论
那就在另一终端用 `kill -9 pid' 把它杀掉吧, 不成再来 kill -15 pid
取消 评论
killall rcS
取消 评论
ps -l | grep 进程名
kill 进程id
取消 评论
ZOL问答 > python 怎么让程序接受ctrl + c终止讯号

热门护眼台灯排行

查看更多排行 >

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

扫码参与新品0元试用
晒单、顶楼豪礼等你拿

扫一扫,关注我们
提示

确定要取消此次报名,退出该活动?