python 判断脚本中断问题
具体逻辑是我有个永久循环往mysql里写数据,所以不能close,怎么样在KeyboardInterrupt或者进程被杀时执行mysqldb的close()...
具体逻辑是
我有个永久循环往mysql里写数据,所以不能close,怎么样在KeyboardInterrupt 或者进程被杀时 执行mysqldb的close() 展开
我有个永久循环往mysql里写数据,所以不能close,怎么样在KeyboardInterrupt 或者进程被杀时 执行mysqldb的close() 展开
3个回答
展开全部
通过信号量来处理,python 提供signal模块。当用户按Ctrl+C结束进程时,会执行特定代码。
信号的概念
信号(signal)-- 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。
几个常用信号:
SIGINT 终止进程 中断进程 (control+c)
SIGQUIT 退出进程
SIGTERM 终止进程 软件终止信号 (默认信号)
SIGKILL 终止进程 杀死进程
SIGALRM 闹钟信号
当直接写kill PID,默认是SIGTERM
代码示例:
import time
from signal import signal, SIGINT
def ctlc(a,b):
print('ctrk+c')
exit(2)
signal(SIGINT, ctlc)
while True:
time.sleep(1)
展开全部
使用 signal 模块 (首先你要先有 unix/linux 下信号 signal 的一些基本概念,才能理解 signal 模块,这块内容你自己去搜索吧)
参考下面的代码,函数 cb 会在程序收到 SIGINT (ctrl-c 产生,即 KeyboardInterrupt)和 SIGTERM 时调用,你应该在里面加上close。 后面那个 while True 循环模拟你那个永久写数据的代码。 这个程序就可以在收到 SIGINT SIGTERM 信号时达到你要的效果。
import signal, time
def cb(s, f):
print 'recv signal', s
# close at here
exit(0)
signal.signal(signal.SIGTERM, cb)
signal.signal(signal.SIGINT, cb)
print 'start'
while True:
time.sleep(1)
print 'done'
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用信号
import signal
def handler(signum, frame):
close()
.....
signal.signal(signal.SIGINT, handler) #设置信号处理函数,当SIGINT中断时响应
import signal
def handler(signum, frame):
close()
.....
signal.signal(signal.SIGINT, handler) #设置信号处理函数,当SIGINT中断时响应
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询