私はサブプロセスを生成するためにPythonタイマーを起動するプログラムを持っています。これらのサブプロセスは、私のプログラムが終了したり、終了したりすると終了する必要があります。これを行うために、私は "prctl hack"を使用しています。私が得意でない行動は、私の主なプロセスが実行中であっても、子供たちが殺されることです。あなたがスレッドが死ぬ前に、sleep
プロセスがまだ実行されている、それに気づくことができスレッドが死ぬとサブプロセスが死ぬ
from threading import Timer
import time
import os
import subprocess
import ctypes
import signal
def set_pdeathsig():
print("child PID: %d" % os.getpid())
print("child's parent PID: %d" % os.getppid())
prctl = ctypes.CDLL("libc.so.6").prctl
PR_SET_PDEATHSIG = 1
prctl(PR_SET_PDEATHSIG, signal.SIGTERM)
def thread1():
subprocess.Popen(['sleep', 'infinity'], preexec_fn=set_pdeathsig)
time.sleep(10)
print("thread 1 finished")
def thread2():
subprocess.Popen(['sleep', 'infinity'], preexec_fn=set_pdeathsig)
time.sleep(10)
print("thread 2 finished")
print("main thread PID: %d" % os.getpid())
t1 = Timer(1, thread1)
t2 = Timer(1, thread2)
t1.start()
t2.start()
time.sleep(100)
:次のコードは、問題を再作成します。タイマースレッドが終了すると、メインスレッドが稼働していても、それぞれのサブプロセスが終了します。
明らかに、あなたは関数 'os.setpgid'を呼び出しません。 –
ありがとう@TheophileDano、これは以前のテストのコードです。それはそこにはないはずです。私がそれを取り除くと、問題は依然として続きます。 –