|
@@ -0,0 +1,89 @@
|
|
|
+#!/usr/bin/env python
|
|
|
+import socketio
|
|
|
+import psutil
|
|
|
+import threading
|
|
|
+from app.extensions.utils import round_float
|
|
|
+
|
|
|
+lock = threading.Lock()
|
|
|
+
|
|
|
+background_task_started = False
|
|
|
+client_connecting = 0
|
|
|
+
|
|
|
+
|
|
|
+class ServerNamespace(socketio.AsyncNamespace):
|
|
|
+
|
|
|
+ async def on_connect(self, sid, environ):
|
|
|
+ print(f"{sid} is connected !")
|
|
|
+ global background_task_started, client_connecting
|
|
|
+ lock.acquire()
|
|
|
+ client_connecting = client_connecting + 1
|
|
|
+ lock.release()
|
|
|
+ if not background_task_started:
|
|
|
+ self.server.start_background_task(self.background_task)
|
|
|
+ background_task_started = True
|
|
|
+ # self.emit('my_response', {'data': 'Connected', 'count': 0}, room=sid)
|
|
|
+
|
|
|
+ async def on_disconnect(self, sid):
|
|
|
+ print(f"{sid} is disconnected !")
|
|
|
+ global background_task_started,client_connecting
|
|
|
+ lock.acquire()
|
|
|
+ client_connecting = client_connecting - 1
|
|
|
+ lock.release()
|
|
|
+ if client_connecting == 0:
|
|
|
+ background_task_started = False
|
|
|
+
|
|
|
+
|
|
|
+ async def on_disconnect_request(self, sid):
|
|
|
+ await self.on_disconnect(sid)
|
|
|
+
|
|
|
+ async def on_client_message(self, sid, data):
|
|
|
+ print(data)
|
|
|
+
|
|
|
+ async def on_my_event(self, sid, data):
|
|
|
+ await self.emit('my_response', data)
|
|
|
+
|
|
|
+ async def on_my_room_event(self, sid, message):
|
|
|
+ await self.emit('my_response', {'data': message['data']}, room=message['room'])
|
|
|
+
|
|
|
+ async def on_my_broadcast_event(self, sid, message):
|
|
|
+ await self.emit('my_response', {'data': message['data']})
|
|
|
+
|
|
|
+ async def on_join(self, sid, message):
|
|
|
+ await self.enter_room(sid, message['room'])
|
|
|
+ await self.emit('my_response', {'data': 'Entered room: ' + message['room']}, room=sid)
|
|
|
+
|
|
|
+ async def on_leave(self, sid, message):
|
|
|
+ await self.leave_room(sid, message['room'])
|
|
|
+ await self.emit('my_response', {'data': 'Left room: ' + message['room']}, room=sid)
|
|
|
+
|
|
|
+ async def on_close(self, sid, message):
|
|
|
+ await self.emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.'}, room=message['room'])
|
|
|
+ await self.close_room(message['room'])
|
|
|
+
|
|
|
+ async def background_task(self):
|
|
|
+ global background_task_started
|
|
|
+ while background_task_started:
|
|
|
+ sys_info = await self.get_sys_info()
|
|
|
+ await self.emit('monitor_server', sys_info)
|
|
|
+ await self.server.sleep(1.5)
|
|
|
+
|
|
|
+ async def get_sys_info(self) -> dict:
|
|
|
+ """ 获取系统信息 """
|
|
|
+ sys_info = {}
|
|
|
+ cpu_info = {
|
|
|
+ 'cpuNum': psutil.cpu_count(logical=False), # 物理核数
|
|
|
+ 'used': psutil.cpu_percent(interval=0.1), # cpu使用率
|
|
|
+ 'pids': len(psutil.pids()), # 进程数
|
|
|
+ 'cpu_freq': psutil.cpu_freq().current, # CPU频率
|
|
|
+ 'boot_time': round_float(psutil.boot_time() / (60 * 60 * 60 * 24)), # 系统启动时间
|
|
|
+ }
|
|
|
+ sys_info["cpu_info"] = cpu_info
|
|
|
+ memory_info = psutil.virtual_memory()
|
|
|
+ memory_info = {
|
|
|
+ "total": round_float(memory_info.total / (1024 * 1024 * 1024)),
|
|
|
+ "used": round_float(memory_info.used / (1024 * 1024 * 1024)),
|
|
|
+ "free": round_float(memory_info.free / (1024 * 1024 * 1024)),
|
|
|
+ "percent": memory_info.percent,
|
|
|
+ }
|
|
|
+ sys_info["memory_info"] = memory_info
|
|
|
+ return sys_info
|