2017-10-10 10 views
0

私はSOFですでに同様の質問があったと思います。しかし、私は本当に私の特定のケースのための適切な解決策を見つけることができませんでした。私は起動時にいくつかのワーカースレッドを開き、SIGTERMが受信されるまで実行を継続するデーモンを作ろうとしています。 SIGTERMを受け取ると、親スレッドはすべてのワーカースレッドを終了し、プロセス全体が停止します。これは私のコードがどのように見えるかです:スレッドが起動した後にシグナルハンドラが機能しない

from lib.threadrunner import ThreadRunner 
import signal 
import time 

def sigint_handler(signum, frame): 
    print 'Stop pressing the CTRL+C!' 

signal.signal(signal.SIGINT, sigint_handler) 

objectToRun = ClassToRun(cfg) 

time.sleep(3) 

# The below code uses threading module to create 3 threads 
threadRunner = ThreadRunner() 
threadRunner.load('Task Name', objectToRun) 
threadRunner.start(3) 
threadRunner.joinAll() 

私はすべてのスレッドが開始された後、SIGINTを送信するためにCtrl + Cをヒットした場合は、sigint_handler機能が起動しない、何もプリントアウトされなかっます起こします。しかし、スレッドが(スリープスリープ時間が追加されている間に)起動する前に私がCtrl + Cをヒットすると、Stop pressing the CTRL+C!が表示されます。なぜこれがこのように働いているのか、どうすればこの問題を解決できるかわからない。

PS:threadRunnerクラスのコードが必要な場合は、それも提供します。

答えて

0

親スレッドに無限ループを追加して修正しました。だから、更新されたコードは次のようになります。

from lib.threadrunner import ThreadRunner 
import signal 
import time 

RUN = True 

def sigint_handler(signum, frame): 
    print 'Stop pressing the CTRL+C!' 
    global RUN 
    RUN = False 

signal.signal(signal.SIGINT, sigint_handler) 

objectToRun = ClassToRun(cfg) 

time.sleep(3) 

# The below code uses threading module to create 3 threads 
threadRunner = ThreadRunner() 
threadRunner.load('Task Name', objectToRun) 
threadRunner.start(3) 
# threadRunner.joinAll() 

while RUN: 
    time.sleep(1) 

私の観察は、スレッドを起動した後に実行するこれ以上のコードがありませんでしたとして、親スレッドが非アクティブ状態になり、言います。それでSIGINTが正しく処理されなかったのです。しかし、このループは親スレッドを生きたままにしているため、SIGINTが適切に処理されました。しかし、これはちょうど私の観察に基づいています。もし誰かが適切な説明をすることができればそれはすばらしいでしょう。

関連する問題