跳到主內容

Theme / 0.9.130

Pstack

用可驗證的工作流程協作,從單一入口學會工程技能

Skills

principle-separate-before-serializing-shared-state | 先拆共享輸出再考慮序列化

並行寫入前先拆分獨立檔案與擁有權,只有單一共享狀態確實必要時,才以結構性機制控制寫入。

principle-separate-before-serializing-shared-state | 先拆共享輸出再考慮序列化

本頁以 pstack-claude 0.9.126 為基準。原文設定 user-invocable: false,通常由 poteto-mode 按需讀取。這裡的序列化是依序控制存取,不是把物件轉成 JSON。

定位與適用情境

當多個執行者可能修改同一檔案、分支、鍵值或狀態物件,先確認是否真的需要共享寫入目標。各自發布獨立事實時,分開輸出通常比立刻加鎖更直接。只有單一共享狀態是必要不變條件時,才結構性地序列化存取。

例如索引程序與監測程序都讀寫 state.json,前者更新 lastIndexed,後者更新 lastMeasured。即使欄位不同,兩者仍可能讀到舊版本,再各自整份覆寫,造成另一方的更新消失。

準備

  • 提供兩個程序的狀態讀寫位置、啟動方式與報表讀取端。
  • 列出每個欄位的寫入者及讀取者,確認索引與監測是否為可獨立發布的事實。
  • 訂定報表一致性需求。若一定要同一時間點的共同快照,必須明列,不能假設拆檔後自然具有該保證。

操作步驟

  1. 追蹤共享可變狀態的讀取、修改、寫回流程。畫出兩個程序同時讀取舊 state.json 的交錯順序,指出可能遺失哪個欄位。
  2. 先消除不必要的共享目標。讓索引程序獨占 indexer-state.json,監測程序獨占 metrics-state.json。不要只在同一物件中分配不同欄位。
  3. 將合併移到報表讀取邊界,讀取兩份狀態並顯示各自時間。若確認需要共同快照或唯一序號,才為必要共享部分選擇單一寫入者、鎖定檔、循序階段或原子比較交換。
  4. 在隔離測試中讓兩個程序交錯更新,確認各自狀態都保留最新值。若使用同步機制,另驗證競爭時只有合法寫入能成功,不以「請勿同時執行」代替控制。

可直接使用的提示詞

套用 principle-separate-before-serializing-shared-state,檢查索引程序與監測程序共寫 state.json 的設計。
先列出讀寫流程與各欄位擁有者。
優先將獨立事實拆為 indexer-state.json 與 metrics-state.json,在報表讀取端合併。
若有真正需要單一共享物件的不變條件,指出證據,再提出結構性同步方法。
給出交錯更新的驗證案例與一致性限制。這次只交付方案,不啟動程序或修改共用檔。

預期結果與驗收

  • 每個獨立輸出都有唯一寫入者,並行更新不會互相覆蓋。
  • 報表能同時顯示兩個來源的最新值,也明示兩份資料不一定屬於同一瞬間。
  • 仍保留的共享寫入目標,都能說出不能拆分的原因及實際保護機制。
  • 交錯測試可重現原本遺失更新的風險,並在新設計中檢查兩邊結果,而非只看程序是否結束。

限制與權限

常見誤用是未分析就加全域鎖,或認為不同 JSON 欄位不算共享。文字約定、排程習慣與提醒代理小心,都不是並行控制。

拆分輸出只消除不必要的共享,不自動保證跨檔交易或共同快照。也不能在未確認報表端的情況下改名、刪除原檔。本頁未操作任何並行程序或共享檔,讀者仍須取得實作與資料變更授權。

延伸閱讀與來源