テクノロジー · 実用ガイド

Python resource_tracker の leaked shared_memory:所有者を一つにする

track を変える前に creator、attacher、tracker family を整理し、一つの process だけが unlink を所有するようにします。

Original diagram mapping a shared-memory creator, attachers, tracker family and one unlink owner.
オリジナルイラスト:track の前に一つの shared-memory lifecycle owner を決める。 Watch at Ease

resource_tracker の warning は close() 忘れだけを意味しません。独立した Python process family が同じ POSIX shared-memory 名を所有すると考え、先に終了した tracker が使用中の名前を早く削除する場合があります。

修正は所有権の決定です。Python version、platform、launch ancestry、creator、attacher、shutdown 順を記録し、名前ごとに一つの unlink owner を割り当ててから track を選びます。

process topology を固定する

OS、Python version、start method、service manager、creator PID、attacher PID、launch 方法、exit 順を記録します。別 terminal、subprocess tree、container、uWSGI worker は別 tracker family の可能性があります。

正確な name、create、track、全 close/unlink call、元の warning と後続 attach 結果を保存します。

handle、mapping、name lifetime を分ける

close() はこの object の access を終了します。POSIX の unlink() は name を削除し、mapping と最終回収は platform rule に従います。local close は name の存続や cleanup owner を証明しません。

name ごとに creator、active attacher、tracker family、durable owner、close responsibility、一つの unlink responsibility を表にします。

track の前に owner model を選ぶ

一つの multiprocessing family では shared tracker が abnormal exit cleanup を担当できますが、各 handle の close と一つの normal unlink path は必要です。全 worker に unlink させません。

独立または cross-language process では consumer より長生きする coordinator を選びます。Python 3.13+ の非所有 attacher は別 owner が cleanup するときだけ track=False を使います。

version と platform を分ける

Python 3.13 より前には public track がありません。private unregister や monkey patch を一般的な production fix にせず、upgrade、process family 統合、明示的 coordinator を選びます。

Windows は track を無視し、POSIX name は unlink と final unmap まで残り得ます。platform 別 acceptance が必要です。

二方向 shutdown test を行う

owner と二つの non-owner を起動し generation marker を書き、一つの non-owner を停止します。新しい attacher が同じ name と marker を読める必要があります。

残りの non-owner、最後に owner を停止し、一回の unlink 後は新 attach が失敗することを確認します。abnormal exit は disposable fixture で別に試します。

Original decision diagram requiring shared-memory survival after a non-owner exits and cleanup after the owner exits.
オリジナルイラスト:shutdown test は存続と cleanup の両方を確認する。 Watch at Ease