2017-05-30 46 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

相關問題