demo2_store_independence.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python3
  2. """
  3. Demo 2: 并行安全分析 — Store Independence 检查
  4. ===============================================
  5. 构造 IoT 场景: ClimateAgent + LightAgent 同时修改 userComfort,
  6. lambdagent 的 store_analysis 在编译时发现写入冲突。
  7. 核心信息:
  8. - 两个 Agent 并行修改同一个 store key → 竞态条件
  9. - 在真实设备上: 空调和灯互相打架
  10. - lambdagent 的 Proposition 30 保证并行安全
  11. """
  12. import sys
  13. import os
  14. sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
  15. from lambdagent import Lam, Pair, StoreConflictError
  16. from lambdagent.store_analysis import check_store_independence, writes
  17. def main():
  18. print("=" * 60)
  19. print("Demo 2: 并行安全分析 — Store Independence")
  20. print("场景: 鸿蒙 IoT 智能家居 — 多 Agent 并行控制")
  21. print("=" * 60)
  22. print()
  23. # ── Step 1: 定义三个 IoT Agent ──
  24. print("[Step 1] 定义 IoT Agent")
  25. climate = Lam("ClimateAgent", "根据温度调节空调")
  26. climate._writes = {"userComfort.temperature", "deviceState.ac"}
  27. light = Lam("LightAgent", "根据光线调节灯光")
  28. light._writes = {"userComfort.brightness", "deviceState.light"}
  29. security = Lam("SecurityAgent", "安防监控")
  30. security._writes = {"securityState.alert", "deviceState.camera"}
  31. print(f" ClimateAgent writes: {climate._writes}")
  32. print(f" LightAgent writes: {light._writes}")
  33. print(f" SecurityAgent writes: {security._writes}")
  34. print()
  35. # ── Step 2: 检查 Climate + Light (无冲突) ──
  36. print("[Step 2] 检查 ClimateAgent ∥ LightAgent")
  37. try:
  38. check_store_independence([climate, light])
  39. print(" ✅ Store independence satisfied — 无写入冲突")
  40. except StoreConflictError as e:
  41. print(f" ❌ [CONFLICT] {e}")
  42. print()
  43. # ── Step 3: 构造冲突场景 ──
  44. print("[Step 3] 构造冲突: 两个 Agent 都写 userComfort")
  45. print(" (模拟: LightAgent 也想调节温度以配合灯光色温)")
  46. light_v2 = Lam("LightAgent_v2", "调节灯光 + 色温联动温度")
  47. light_v2._writes = {"userComfort.temperature", "userComfort.brightness", "deviceState.light"}
  48. print(f" ClimateAgent writes: {climate._writes}")
  49. print(f" LightAgent_v2 writes: {light_v2._writes}")
  50. print()
  51. try:
  52. check_store_independence([climate, light_v2])
  53. print(" ✅ No conflict")
  54. except StoreConflictError as e:
  55. print(f" ❌ [CONFLICT] {e}")
  56. print()
  57. print(" → 两个 Agent 同时修改 userComfort.temperature")
  58. print(" → 在真实设备上: 空调刚设 26°C,灯光联动改成 22°C")
  59. print(" → 用户体验: 空调忽冷忽热,灯光闪烁")
  60. print(" → lambdagent 在编译时就阻止了这种部署")
  61. print()
  62. # ── Step 4: 三 Agent 全量检查 ──
  63. print("[Step 4] 三 Agent 全量检查")
  64. agents = [climate, light, security]
  65. try:
  66. check_store_independence(agents)
  67. print(" ✅ 三个 Agent 并行安全 — 写入集合两两不相交")
  68. intersection_info = [
  69. f" {a._name} ∩ {b._name} = ∅"
  70. for i, a in enumerate(agents)
  71. for b in agents[i+1:]
  72. ]
  73. for info in intersection_info:
  74. print(info)
  75. except StoreConflictError as e:
  76. print(f" ❌ [CONFLICT] {e}")
  77. print()
  78. print("=" * 60)
  79. print("结论: Proposition 30 — Pair 安全当且仅当写入集合两两不相交")
  80. print("鸿蒙 Agent DSL 没有这个检查 → 跨设备并行存在数据竞争风险")
  81. print("=" * 60)
  82. if __name__ == "__main__":
  83. main()