python 判断脚本中断问题

具体逻辑是我有个永久循环往mysql里写数据,所以不能close,怎么样在KeyboardInterrupt或者进程被杀时执行mysqldb的close()... 具体逻辑是
我有个永久循环往mysql里写数据,所以不能close,怎么样在KeyboardInterrupt 或者进程被杀时 执行mysqldb的close()
展开
 我来答
就烦条0o
2015-12-21 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46487
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部

通过信号量来处理,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)
kwydwuf
2015-02-02 · TA获得超过7409个赞
知道大有可为答主
回答量:1527
采纳率:71%
帮助的人:1993万
展开全部

使用 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'
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ne0787411
2015-02-02 · TA获得超过151个赞
知道小有建树答主
回答量:131
采纳率:0%
帮助的人:119万
展开全部
用信号

import signal

def handler(signum, frame):
close()

.....

signal.signal(signal.SIGINT, handler) #设置信号处理函数,当SIGINT中断时响应
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式