2017-06-30 24 views
1

これは、多くの人がそれに遭遇したと思われる単純な状況かもしれません。 私は何かをし、無限ループでいつかスリープするシンプルなpythonプログラムを持っています。私はこのプログラムをSIGHUPで正常に終了させるためにシグナルを使いたいと思っています。スリープ中にcallee.pyに信号が送られると、すぐにプログラムは終了しますが、スリープを終了して終了すると思います。sleep pythonループでのシグナル処理2.7

この動作を回避する回避策はありますか?私はこれを達成することができる他の方法にも開いています。

注:これはpython3で期待どおりに動作しますが、現在Python 2.7から3にある既存のモジュールを移植することはできません。

これは私が持っているコードです:私は今日、同じ問題に遭遇した

callee.py

stop_val = False 
def should_stop(signal, frame): 
    print('received signal to exit') 
    global stop_val 
    stop_val = True 

def main(): 
    while not stop_val: 
     signal.signal(signal.SIGTERM, should_stop) 
     # do something here 
     print('Before sleep') 
     time.sleep(300) 
     print('after sleep') 

caller.py

pid = xxx; 
os.system('kill -15 %s' % pid) 
+0

「os.system」という副作用は廃止されました。 'subprocess.Popen'を使うのが好きです。 – DeepSpace

+0

注目。ありがとうございました – madhuri

答えて

0

。ここに、python3の振る舞いを模倣する単純なラッパーがあります:

def uninterruptable_sleep(seconds): 
    end = time.time()+seconds 
    while True: 
     now = time.time() # we do this once to prevent race conditions 
     if now >= end: 
      break 
     time.sleep(end-now) 
関連する問題