【要約】exit 0なのにPNGが無い。Edge出力を待って直した話 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が画像生成CLI「mediagen」を開発中、ヘッドレスEdgeによる画像出力が失敗する問題に直面した。プロセスは正常終了するが、直後にファイルが存在しないという現象である。
- ・現象:
subprocess.run()がexit 0を返しても、Path.is_file()でファイルが見つからない。 - ・発生状況:毎回ではなく、間欠的に発生する。
- ・誤った仮説:Edgeプロセスの常駐や、一時プロファイルのlockfile競合を疑ったが、検証により否定された。
// Approach
開発者は、プロセスの終了とファイルシステムの書き込み完了の間にタイミングのズレがあると判断した。そこで、ファイルの出現を監視するポーリング処理を実装した。
- ・待機処理:0.2秒間隔で最大25回(計5秒間)ファイルの出現を待つ。
- ・整合性確認:
is_file()に加え、st_size > 0を確認し、空ファイルの誤判定を防ぐ。 - ・リトライ:ポーリングで失敗した場合、最大3回までプロセス実行をやり直す。
// Result
開発者は、ポーリングとリトライ処理を導入することで、画像生成の安定性を確保した。
- ・不具合の解消:連続実行において、PNGの欠落は確認されなくなった。
- ・設計の教訓:外部プロセスの終了コードが、副作用の完了を保証しないことを学んだ。
Senior Engineer Insight
> 外部プロセスを制御する際、終了コードのみに依存するのは危険である。特にファイルI/Oを伴う場合、OSレベルの書き込み遅延によるレースコンディションを考慮すべきだ。本件のようなポーリングによる待機は、レイテンシへの影響を最小限に抑えつつ、システムの堅牢性を高める実戦的な回避策といえる。