处理 multiprocessing.Manager() 服务器进程终止

问题描述 投票:0回答:1

我正在编写我的第一个多处理应用程序。

当操作系统杀死由 multiprocessing.Manager() 生成的服务器进程时,无论是由于 OOM 还是我手动 SIGKILL 它,一些但不是全部的子进程也会终止。我的应用程序处于错误状态,systemctl 没有像我希望的那样重新启动它。

我尝试实现一个看门狗子进程来监视其兄弟进程和管理器的服务器进程,但它会随着管理器进程而终止。

看来我的选择是:

  1. 在父进程中执行看门狗功能,或者:
  2. 让我的子看门狗进程通过 sd_notify() API 向 systemd 发送 keepalive,并配置 systemd 在没有此信号的情况下重新启动服务。

还有其他值得考虑的选择吗?哪个最好,为什么?

python multiprocessing systemd watchdog
1个回答
0
投票

不幸的是,当您使用 SIGKILL 进程树的父线程时,没有明确的方法可以删除孤立的子线程。 SIGKILL 旨在强制关闭应用程序。但是,您可以对 SIGINT 进行自定义处理,以便您可以编写代码以更优雅地退出...

#!/usr/bin/env python
import signal
import sys
import multiprocessing
from functools import partial # * if you don't want this you don't need it... its cleaner though

def worker_function():
    print("Worker process is running...")
    try:
        while True:
            # Your worker logic goes here
            pass
    except KeyboardInterrupt:
        print("Worker process received Ctrl+C signal.")
    finally:
        print("Worker process is exiting.")

def signal_handler(sig, frame, processes):
    print('Main process received Ctrl+C signal. Terminating child processes...')
    for process in processes:
        process.terminate()
        process.join()
    print('Main process is exiting.')
    sys.exit(0)

if __name__ == "__main__":
    processes = []  # Create an empty list to hold references to child processes
    # using lambda function for closure, passes in pointer to processes, works without functools
    # signal.signal(signal.SIGINT, (lambda sig, frame: signal_handler(sig, frame, processes)))
    signal.signal(signal.SIGINT, partial(signal_handler, processes=processes))
    print('Press Ctrl+C to exit')

    try:
        for i in range(3):
            process = multiprocessing.Process(target=worker_function)
            processes.append(process)
            process.start()
        for process in processes:
            process.join()
    except KeyboardInterrupt:
        signal_handler(signal.SIGINT, None, processes)
© www.soinside.com 2019 - 2024. All rights reserved.