2017-05-30 43 views
2

我有4个职位像这样的死循环:按下Ctrl + C后,如何在程序停止前让Python完成作业?

list1 = [] 
while 1: 
    try: 
     # job1 
     a = B() 
     # job2 
     c = a.accd() 
     # job3 
     d = len(c) 
     # job4 
     list1.append(d) 
    except KeyboardInterrupt: 
     # save list1 into database(took long time) 
     break 

我按下Ctrl + C后,我不能确保它所有4个作业,然后停止。

这似乎工作时,它正在睡觉,但它有睡眠延迟。

list1 = [] 
while 1: 
    try: 
     # job1 
     a = B() 
     # job2 
     c = a.accd() 
     # job3 
     d = len(c) 
     # job4 
     list1.append(d) 
    except aaddcdcd: 
     # some code here 
    finally: 
     try: 
      time.sleep(3) # if I press Ctrl + C here it works perfectly 
     except: KeyboardInterrupt: 
      # save list1 into database(took long time) 
      break 

是否有可能在任何时候,当我按一些关键的,它在这个循环中,更新数据库中的所有作业,然后停止。

+0

是工作同时进行或顺序?他们是在同一时间还是一个接一个地运行?不知道这件事。你也试图捕获一个或更多的KeyBoardInterupt? – JimmyNJ

+0

如果睡眠工作,那么只要做'''time.sleep(0.00001)'''或类似的东西,所以你不会注意到它。 – SH7890

+0

睡眠技术是危险的,因为你希望休息时发生在睡眠......但它可能不会 –

回答

2

好的,我有两个答案给你。

先回答

def jobOne(): 
    pass 
def jobTwo(): 
    pass 
def jobThree(): 
    pass 
def jobFour(): 
    pass 

interrupted = False 
finished  = False 
jobs   = [jobOne, jobTwo, jobThree, jobFour] 
jobsCarriedOut = [0] * len(jobs) 
currentJob  = 0 

while (not finished or not interrupted): 
    try: 
     jobs[currentJob]() 
     jobsCarriedOut[currentJob] += 1 

     currentJob += 1 

     if currentJob == len(jobs): 
      currentJob, finished = 0, True 
     else: 
      finished = False 
    except KeyboardInterrupt: 
     interrupted = True 

print(jobsCarriedOut) 

这件作品将退出一旦KeyboardInterrupt已被触发,所有的工作已经完成。

第二个答案

我只是一派禁用键盘中断蟒蛇,发现这个How can I override the keyboard interrupt? (Python)以及与此代码略有不同走了过来。

import signal 

def signal_handler(signal, frame): 
    global interrupted 
    interrupted = True 

def jobOne(): 
    pass 
def jobTwo(): 
    pass 
def jobThree(): 
    pass 
def jobFour(): 
    pass 

interrupted = False 
finished  = False 
jobs   = [jobOne, jobTwo, jobThree, jobFour] 
jobsCarriedOut = [0] * len(jobs) 
currentJob  = 0 

signal.signal(signal.SIGINT, signal_handler) 

while (not finished or not interrupted): 
    jobs[currentJob]() 
    jobsCarriedOut[currentJob] += 1 
    currentJob += 1 
    if currentJob == len(jobs): 
     currentJob, finished = 0, True 
    else: 
     finished = False 

print(jobsCarriedOut) 

我从来没有使用的信号库(甚至听说过),所以这里是documentation

编辑我从来没有使用全局变量,所以我使用的可能是错误的。

编辑两个第一个示例只有80%的〜时候,由于在每一步没有试图捕捉错误

+0

首先回答不好,因为你指出的原因。第二个答案很好,但我不确定你为什么介绍所有的废话。 OP的代码只是一系列相关的函数调用。只需在循环体中运行直线代码就简单多了。 – pat

+0

@pat我回答之前,他添加了什么工作 –

+0

啊,我没有看到OP的原始代码! – pat

相关问题