科技 · 實用指南
Python resource_tracker 顯示 leaked shared_memory:只指定一個生命週期擁有者
改 track 前先畫出建立者、附加者與 tracker 家族。只讓一個程序負責 unlink,並測試存活與清理。

resource_tracker 警告不一定代表漏了 close()。兩個獨立 Python 程序家族也可能同時認為自己擁有同一 POSIX shared-memory 名稱,先結束的 tracker 會過早移除仍需使用的名稱。
修正首先是擁有權決定。記錄 Python 版本、平台、啟動關係、建立者、附加者與結束順序;每個名稱只指定一個 unlink 擁有者,再決定 track。
凍結程序拓撲
記錄 OS、Python 版本、start method、service manager、建立者 PID、附加者 PID、啟動方式與結束順序。不同 terminal、subprocess tree、container 與 uWSGI worker 要先視為可能不同 tracker 家族。
記錄精確名稱、create、track 與所有 close/unlink 呼叫。保留原始警告和後續 attach 結果,不把舊警告改寫成當前版本事實。
分開 handle、mapping 與名稱壽命
close() 結束目前物件的存取。POSIX 的 unlink() 移除名稱;現有 mapping 與最終回收遵循平台規則。本地 close 不代表名稱仍可附加或已有清理擁有者。
每個名稱一列,寫下建立者、活動附加者、tracker 家族、長期擁有者、close 責任與唯一 unlink 責任。多個 unlink 擁有者會衝突,沒有擁有者才有真正 leak 風險。
先選擁有者模型,再選 track
單一 multiprocessing 家族可讓共用 tracker 處理異常結束,但應用仍要關閉所有 handle 並保留一條正常 unlink 路徑。不要讓每個 worker unlink。
獨立或跨語言程序要選比消費者更長壽的 coordinator。Python 3.13+ 的非擁有者只有在其他程序或系統明確負責清理時才使用 track=False。
明確版本與平台分支
Python 3.13 以前沒有公開 track。不要把私有 unregister 或 monkey patch 當成通用 production 修正;應升級、合併程序家族或用明確 coordinator 管理清理。
Windows 忽略 track;POSIX 名稱可持續到 unlink 與最後 unmap。跨平台服務必須分別定義驗收。
執行雙向結束測試
啟動擁有者與兩個非擁有者,寫入 generation 標記,停止一個非擁有者。新的 attacher 必須仍能開啟同名物件並讀到標記。
停止另一個非擁有者,最後由擁有者做唯一 unlink。此後新 attach 必須失敗;異常終止另用可丟棄 fixture 測試。
