我有一个Python应用程序,它作为kubernetes pod中的主进程运行,这个进程启动一些子进程来长轮询SQS队列列表(每个队列1个进程)。有时,其中一个进程会变成僵尸,停止处理,并挂断所有其他进程,包括父进程
if __name__ == '__main__':
PROCESSES = []
for queue, module in qfmapper.items():
PROCESSES.append(Process(target=poll_for_messages, args=(queue,module)))
for process in PROCESSES:
process.start()
for process in PROCESSES:
process.join()
我尝试过在启动子进程之前处理父进程中的SIGCHLD
信号,但如果其中一个子进程被杀死,这似乎不会杀死父进程。我知道这会留下其他子进程,但既然kubernetes在PID 1死亡时杀死pod,那就没关系了。然而,这似乎不起作用,因为家长对此没有反应。我假设这是因为process.join()阻塞了父进程
因此,我尝试用Pool
替换单个Process
调用:
with contextlib.closing(mp.Pool(len(qfmapper))) as pool:
for queue, module in qfmapper.items():
pool.apply_async(poll_for_messages, args=(queue, module))
pool.close()
pool.join()
这再一次像预期的那样启动了轮询过程,但是杀死一个似乎不会再次被相同的调用所取代。它启动另一个worker来维护Pool
,但它不会使用与原始apply_async
调用相同的参数启动它
我还尝试使用map
,如果进程被杀死,会重新启动进程,但不会循环遍历列表中的所有队列;它只是多次执行列表中的第一个。我也尝试过starmap
,只是使用for循环来构建一个可重用列表,但是如果其中一个工作人员被杀,这也无法恢复
所以,最终,这又回到了这个问题的标题上。如何自动重新启动已终止/已终止的进程?我到处寻找,似乎找不到任何答案来回答我认为“正常”的事情。这都是在Python3.7.3上运行的,但是如果它有任何值得用来解决这个问题的特性,我可以升级到3.8
目前没有回答
相关问题 更多 >
编程相关推荐