我正在编写我的第一个多处理应用程序。
当操作系统杀死由 multiprocessing.Manager() 生成的服务器进程时,无论是由于 OOM 还是我手动 SIGKILL 它,一些但不是全部的子进程也会终止。我的应用程序处于错误状态,systemctl 没有像我希望的那样重新启动它。
我尝试实现一个看门狗子进程来监视其兄弟进程和管理器的服务器进程,但它会随着管理器进程而终止。
看来我的选择是:
还有其他值得考虑的选择吗?哪个最好,为什么?
不幸的是,当您使用 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)