在kubernetes中自动重新启动子python进程

2024-09-30 08:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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


Tags: in列表for队列queue进程processkubernetes

热门问题