Ваши возможности немного ограничены. Если выполнение self.daemon = True
в конструкторе для класса Worker
не решит вашу проблему и попытка перехватить сигналы в родительском элементе (т. Е. SIGTERM, SIGINT
) не сработает, возможно, вам придется попробовать противоположное решение - вместо если родитель убьет детей, вы можете заставить детей покончить жизнь самоубийством после смерти родителя.
Первый шаг - присвоить конструктору Worker
PID
родительского процесса (вы можете сделать это с помощью os.getpid()
). Затем, вместо того, чтобы просто делать self.queue.get()
в рабочем цикле, сделайте что-то вроде этого:
waiting = True
while waiting:
# see if Parent is at home
if os.getppid() != self.parentPID:
# woe is me! My Parent has died!
sys.exit() # or whatever you want to do to quit the Worker process
try:
# I picked the timeout randomly; use what works
data = self.queue.get(block=False, timeout=0.1)
waiting = False
except queue.Queue.Empty:
continue # try again
# now do stuff with data
Приведенное выше решение проверяет, отличается ли родительский PID от того, чем он был изначально (то есть, если дочерний процесс был принят init
или lauchd
, потому что родитель умер) - см. reference . Однако, если это по какой-то причине не работает, вы можете заменить его следующей функцией (адаптировано с здесь ):
def parentIsAlive(self):
try:
# try to call Parent
os.kill(self.parentPID, 0)
except OSError:
# *beeep* oh no! The phone's disconnected!
return False
else:
# *ring* Hi mom!
return True
Теперь, когда Родитель умирает (по какой-либо причине), Рабочие-дети самопроизвольно падают, как мухи - как вы и хотели, вы, демон! :-D