2016-12-01 3 views
0

終了後にプロセスがまだ生きているのはなぜですか? TimeoutProcessは、から派生したクラスです。プロセスであり、終了方法がオーバーロードされません。ここPython process.teminateが機能しない

p = TimeoutProcess(target=fn, args=args, kwargs=kwargs) 
p.start() 
p.join(self.timeout_duration) 
if p.is_alive(): 
    p.terminate() 
    time.sleep(0.1) 
    print(p, p.is_alive()) 
    raise TimeoutError 
if p.exception: 
    raise p.exception 

terminate関数信号(SIGTERM)を介してプロセスへの非同期終了要求を発行する出力

(TimeoutProcess(TimeoutProcess-1は、開始)、TRUE)

+1

通常のProcessクラスを使用して試してみましたが、プロセスは強制終了されました。おそらくfn関数の問題? –

答えて

0

あります。

joinメソッドを使用して、終了を待って終了ステータスを収集する必要があります。

p = TimeoutProcess(target=fn, args=args, kwargs=kwargs) 
p.start() 
p.join(self.timeout_duration) 
if p.is_alive(): 
    p.terminate() 
    p.join(10) # wait for process to correctly terminate 
    if p.is_alive(): # in corner cases it might still happen 
     raise TimeoutError 
if p.exception: 
    raise p.exception 

まだTimeoutErrorが発生した場合、子プロセスはSIGTERM要求を呑み込んでいる可能性があります。

SIGTERMのデフォルトの動作が上書きされている(シグナルハンドラがLinuxで継承されている)か、関数fnがCループ内でスタックされている(ctypesベースのAPIを使用している場合など)実際にリソースを解放するコントロールを取得します。

このような問題を扱うコードの簡単な例は、hereです。

関連する問題