2017-05-30 2 views
2

私はこのような4つのジョブの無限ループを持っている:私はCtrlキー+ Cを押し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 

した後、私はそれがすべての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

でエラーをトラップしないように、時間の〜80%のみで動作します

EDIT TWOは、同時または連続的な仕事はありますか?彼らは同じ時間にまたは次々に走っていますか?これが問題なのかどうかはわかりませまた、KeyBoardInterupt以上をキャプチャしようとしていますか? – JimmyNJ

+0

スリープ状態になったら、 '' 'time.sleep(0.00001)' 'などのようにして気付かないようにしてください。 – SH7890

+0

睡眠のテクニックは、睡眠中に休憩が起こることを望んでいるので危険です。しかし、そうではないかもしれません。 –

答えて

2

だから私はあなたのために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がトリガされていて、すべてのジョブが終了したら終了します。

第二に答え

私は単純に無効にキーボード割り込みのpythonをGoogleで検索して、この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

EDITです。最初の例では、原因の各ステップ

+0

最初の答えはあなたが指摘している理由では良くありません。二番目の答えは良いですが、なぜ私はすべての仕事のナンセンスを導入したのか分かりません。 OPのコードは、単に依存する関数呼び出しのシーケンスです。ループの本体で直線コードを実行するほうがずっと簡単です。 – pat

+0

@pat私は彼が仕事を追加する前に答えた –

+0

ああ、私はOPのオリジナルコードを見ていない! – pat

関連する問題