gpt4 book ai didi

Python-daemon 不会杀死它的 child

转载 作者:IT老高 更新时间:2023-10-28 20:45:26 24 4
gpt4 key购买 nike

使用 python-daemon 时,我正在创建子流程:

import multiprocessing

class Worker(multiprocessing.Process):
def __init__(self, queue):
self.queue = queue # we wait for things from this in Worker.run()

...

q = multiprocessing.Queue()

with daemon.DaemonContext():
for i in xrange(3):
Worker(q)

while True: # let the Workers do their thing
q.put(_something_we_wait_for())

当我使用 Ctrl-C 或 SIGTERM 等杀死父守护进程(即不是 Worker)时,子进程不会死。一个人是如何杀死 child 的?

我的第一个想法是使用 atexit杀死所有的 worker ,就像这样:

 with daemon.DaemonContext():
workers = list()
for i in xrange(3):
workers.append(Worker(q))

@atexit.register
def kill_the_children():
for w in workers:
w.terminate()

while True: # let the Workers do their thing
q.put(_something_we_wait_for())

但是,守护进程的子进程是难以处理的事情,我不得不就应该如何完成这件事提出想法和意见。

谢谢。

最佳答案

您的选择有点有限。如果在 Worker 类的构造函数中执行 self.daemon = True 并不能解决您的问题并尝试在 Parent 中捕获信号(即 SIGTERM, SIGINT ) 不起作用,您可能必须尝试相反的解决方案 - 与其让 parent 杀死 child ,不如让 child 在 parent 去世时自杀。

第一步是给构造函数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 是否与原来不同(即子进程是否被 initlauchd 采用,因为 parent 去世)-见reference .但是,如果由于某种原因这不起作用,您可以将其替换为以下函数(改编自 here):

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

现在,当 parent 去世(无论出于何种原因)时,子 worker 会像苍蝇一样自发地倒下——正如你所愿,你的恶魔! :-D

关于Python-daemon 不会杀死它的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com