目錄
Python信號處理:優雅地終止父進程及其子進程
問題描述
解決方案:利用進程組
首頁 後端開發 Python教學 如何在Python中通過信號殺死父進程後確保子進程也終止?

如何在Python中通過信號殺死父進程後確保子進程也終止?

Apr 02, 2025 am 06:39 AM
python ai

如何在Python中通過信號殺死父進程後確保子進程也終止?

Python信號處理:優雅地終止父進程及其子進程

在Python多進程編程中,使用信號終止父進程後,子進程可能持續運行,這通常需要更精細的進程管理策略。本文探討此問題並提供解決方案。

問題描述

假設a.py創建了一個父進程和一個子進程,父進程ID寫入文件。 b.py讀取此ID並發送終止信號(SIGTERM)。然而,父進程終止後,子進程可能繼續運行。

以下為示例代碼(與原文略有不同,更簡潔易懂,並修復了原代碼中的錯誤):

a.py:

 import multiprocessing
import os
import signal
import time

def child_process():
    while True:
        print("子進程運行中...")
        time.sleep(1)

if __name__ == "__main__":
    child = multiprocessing.Process(target=child_process)
    child.start()
    with open("pidfile.txt", "w") as f:
        f.write(str(os.getpid()))
    child.join() # 等待子進程結束print("父進程結束")
登入後複製

b.py:

 import os
import signal

try:
    with open("pidfile.txt", "r") as f:
        pid = int(f.read())
        os.kill(pid, signal.SIGTERM)
        print(f"已向進程{pid} 發送SIGTERM 信號")
except FileNotFoundError:
    print("pidfile.txt 未找到")
except Exception as e:
    print(f"發生錯誤: {e}")
登入後複製

解決方案:利用進程組

解決此問題關鍵在於理解進程組的概念。父進程及其子進程屬於同一個進程組。通過向進程組發送信號,可以確保所有進程都接收到信號。

改進後的代碼:

a.py:

 import multiprocessing
import os
import signal
import time

def child_process():
    while True:
        print("子進程運行中...")
        time.sleep(1)

if __name__ == "__main__":
    child = multiprocessing.Process(target=child_process)
    child.start()
    pgid = os.getpgid(0) # 獲取當前進程組ID
    with open("pidfile.txt", "w") as f:
        f.write(str(pgid))
    child.join()
    print("父進程結束")
登入後複製

b.py:

 import os
import signal

try:
    with open("pidfile.txt", "r") as f:
        pgid = int(f.read())
        os.killpg(pgid, signal.SIGTERM) # 向進程組發送信號print(f"已向進程組{pgid} 發送SIGTERM 信號")
except FileNotFoundError:
    print("pidfile.txt 未找到")
except Exception as e:
    print(f"發生錯誤: {e}")
登入後複製

通過使用os.getpgid(0)獲取進程組ID,並將進程組ID寫入文件, b.py使用os.killpg()向整個進程組發送SIGTERM信號,確保父進程和子進程都被乾淨地終止。 此外, a.py中的child.join()確保父進程等待子進程結束後才退出,避免了競態條件。 最後,代碼也進行了更健壯的異常處理。

這個改進後的方案更可靠,避免了原代碼中可能存在的潛在問題,並提供了更清晰的代碼結構。

以上是如何在Python中通過信號殺死父進程後確保子進程也終止?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具