m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.5 KiB

6 months ago
  1. #coding:utf8
  2. from kazoo.client import KazooClient
  3. import threading
  4. import time
  5. from global_dict import global_scenes_manager
  6. import json
  7. # 初始化日志
  8. import logging
  9. logger = logging.getLogger(__name__)
  10. def start_zookeeper_listeners(zk, node_path, stop_event, initial_data, initial_children):
  11. '''
  12. 线 ZooKeeper
  13. :param zk:
  14. :param node_path:
  15. :param stop_event:
  16. :param initial_data:
  17. :param initial_children:
  18. :return:
  19. '''
  20. def data_change_listener(data, stat):
  21. if data == initial_data:
  22. return # 忽略之前的状态
  23. if data:
  24. logger.info(f"[DataWatch] 节点数据变化:{data.decode('utf-8')}")
  25. node_data = json.loads(data)
  26. if 'version' in node_data:
  27. scenes_id = str(node_data['scenes_id'])
  28. version = str(node_data['version'])
  29. global_scenes_manager[scenes_id] = version
  30. else:
  31. logger.info("[DataWatch] 节点已删除或不存在")
  32. def children_change_listener(children):
  33. if children == initial_children:
  34. return # 忽略之前的状态
  35. logger.info(f"[ChildrenWatch] 子节点列表变化:{children}")
  36. # 设置监听器
  37. zk.DataWatch(node_path, data_change_listener)
  38. zk.ChildrenWatch(node_path, children_change_listener)
  39. # 等待停止事件
  40. stop_event.wait()
  41. def simulate_changes(zk, node_path):
  42. """
  43. """
  44. try:
  45. time.sleep(2)
  46. print("模拟:更新节点数据")
  47. zk.set(node_path, b"updated data")
  48. time.sleep(2)
  49. print("模拟:创建子节点 child1")
  50. zk.create(f"{node_path}/child1", b"child1 data")
  51. time.sleep(2)
  52. print("模拟:删除子节点 child1")
  53. zk.delete(f"{node_path}/child1")
  54. time.sleep(2)
  55. print("模拟:删除节点")
  56. zk.delete(node_path)
  57. except Exception as e:
  58. print(f"模拟过程中发生错误: {e}")
  59. def monitor(hosts,node_path):
  60. # 连接到 ZooKeeper 服务器
  61. zk = KazooClient(hosts=hosts)
  62. zk.start()
  63. # 获取启动监听器之前的节点状态
  64. if zk.exists(node_path):
  65. initial_data, _ = zk.get(node_path) # 获取节点数据
  66. initial_children = zk.get_children(node_path) # 获取子节点列表
  67. else:
  68. # 如果节点不存在,初始化为空
  69. initial_data = None
  70. initial_children = []
  71. # 创建一个停止事件
  72. stop_event = threading.Event()
  73. # 创建一个线程来运行监听器
  74. listener_thread = threading.Thread(target=start_zookeeper_listeners, args=(zk, node_path, stop_event, initial_data, initial_children))
  75. listener_thread.daemon = True
  76. listener_thread.start()
  77. # 创建一个线程来模拟节点变化
  78. # simulator_thread = threading.Thread(target=simulate_changes, args=(zk, node_path))
  79. # simulator_thread.start()
  80. #
  81. # try:
  82. # # 主线程可以执行其他任务,或者等待子线程完成
  83. # simulator_thread.join()
  84. # except KeyboardInterrupt:
  85. # print("程序被用户中断")
  86. # finally:
  87. # # 触发停止事件
  88. # stop_event.set()
  89. # listener_thread.join()
  90. # zk.stop()
  91. # zk.close()
  92. # print("ZooKeeper 客户端已关闭")
  93. if __name__ == "__main__":
  94. from config_loader import load_config
  95. config = load_config()
  96. monitor(config['zookeeper']['host'], config['zookeeper']['node'])