Python子进程不随主进程退出怎么办?

ID:21565 / 打印

python子进程不随主进程退出怎么办?

python 发信号杀死主进程,子进程仍然运行的解决方法

在 python 中使用信号来终止进程时,常常会出现这样的问题:发出信号后,主进程终止,但子进程仍在运行。这主要是因为信号的传递范围只限于进程,无法跨进程传递。

解决方案:

  1. 使用进程组标识(pgid):

进程组是一组由主进程及其所有子进程构成的集合,并且可以与信号一起使用。可以通过以下步骤解决问题:

立即学习“Python免费学习笔记(深入)”;

  • 在主进程中,使用 os.getpgid(os.getpid()) 获取进程组 id。
  • 将信号处理函数注册到进程组中,而不是主进程。
  • 在终止主进程时,使用 os.killpg(pgid, signal.sigterm) 向进程组发送信号。

这样,信号将传递给进程组中的所有进程,包括子进程。

  1. 将信号处理函数放置在创建子进程之后:

信号处理函数的注册必须放置在创建子进程之后,以确保子进程在注册之前已创建。

修改后的代码示例:

a.py:

import multiprocessing import os import signal import time  def process1():     while true:         print("子进程运行中")         time.sleep(1)  def handle_signal(signum, frame):     print(signum)     if signum == signal.sigterm:         print("received sigterm signal. deleting pid file...")          try:             if os.path.exists("./crawler.pid"):                 os.remove("./crawler.pid")                 print("pid file deleted successfully.")          except exception as e:             print("error deleting pid file:", e)  if __name__ == "__main__":     a = multiprocessing.process(target=process1)     a.daemon = true     a.start()     child_pid = a.pid     parent_pid = os.getpid()      parent_pid_group = os.getpgid(parent_pid)     signal.signal(signal.sigterm, handle_signal)      with open("./crawler.pid", "w") as f:         f.write(str(parent_pid_group))      a.join()      print(f"父进程pid: {parent_pid}")     print(f"子进程pid: {child_pid}")

b.py:

import os import signal  with open("./crawler.pid", "r") as f:     try:         pid = int(f.read())         os.killpg(pid, signal.SIGTERM)         print(f"Signal sent successfully to process {pid}")     except Exception as e:         print(f"Error sending signal: {e}")
上一篇: Tkinter模拟电路:如何让按钮点击实时更新函数图像并控制电路开关?
下一篇: Python和JS MD5加密结果类型差异何在?

作者:admin @ 24资源网   2025-01-14

本站所有软件、源码、文章均有网友提供,如有侵权联系308410122@qq.com

与本文相关文章

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。