server.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/env python
  2. import socketio
  3. import psutil
  4. import threading
  5. from app.extensions.utils import round_float
  6. lock = threading.Lock()
  7. background_task_started = False
  8. client_connecting = 0
  9. class ServerNamespace(socketio.AsyncNamespace):
  10. async def on_connect(self, sid, environ):
  11. print(f"{sid} is connected !")
  12. global background_task_started, client_connecting
  13. lock.acquire()
  14. client_connecting = client_connecting + 1
  15. lock.release()
  16. if not background_task_started:
  17. self.server.start_background_task(self.background_task)
  18. background_task_started = True
  19. # self.emit('my_response', {'data': 'Connected', 'count': 0}, room=sid)
  20. async def on_disconnect(self, sid):
  21. print(f"{sid} is disconnected !")
  22. global background_task_started,client_connecting
  23. lock.acquire()
  24. client_connecting = client_connecting - 1
  25. lock.release()
  26. if client_connecting == 0:
  27. background_task_started = False
  28. async def on_disconnect_request(self, sid):
  29. await self.on_disconnect(sid)
  30. async def on_client_message(self, sid, data):
  31. print(data)
  32. async def on_my_event(self, sid, data):
  33. await self.emit('my_response', data)
  34. async def on_my_room_event(self, sid, message):
  35. await self.emit('my_response', {'data': message['data']}, room=message['room'])
  36. async def on_my_broadcast_event(self, sid, message):
  37. await self.emit('my_response', {'data': message['data']})
  38. async def on_join(self, sid, message):
  39. await self.enter_room(sid, message['room'])
  40. await self.emit('my_response', {'data': 'Entered room: ' + message['room']}, room=sid)
  41. async def on_leave(self, sid, message):
  42. await self.leave_room(sid, message['room'])
  43. await self.emit('my_response', {'data': 'Left room: ' + message['room']}, room=sid)
  44. async def on_close(self, sid, message):
  45. await self.emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.'}, room=message['room'])
  46. await self.close_room(message['room'])
  47. async def background_task(self):
  48. global background_task_started
  49. while background_task_started:
  50. sys_info = await self.get_sys_info()
  51. await self.emit('monitor_server', sys_info)
  52. await self.server.sleep(1.5)
  53. async def get_sys_info(self) -> dict:
  54. """ 获取系统信息 """
  55. sys_info = {}
  56. cpu_info = {
  57. 'cpuNum': psutil.cpu_count(logical=False), # 物理核数
  58. 'used': psutil.cpu_percent(interval=0.1), # cpu使用率
  59. 'pids': len(psutil.pids()), # 进程数
  60. 'cpu_freq': psutil.cpu_freq().current, # CPU频率
  61. 'boot_time': round_float(psutil.boot_time() / (60 * 60 * 60 * 24)), # 系统启动时间
  62. }
  63. sys_info["cpu_info"] = cpu_info
  64. memory_info = psutil.virtual_memory()
  65. memory_info = {
  66. "total": round_float(memory_info.total / (1024 * 1024 * 1024)),
  67. "used": round_float(memory_info.used / (1024 * 1024 * 1024)),
  68. "free": round_float(memory_info.free / (1024 * 1024 * 1024)),
  69. "percent": memory_info.percent,
  70. }
  71. sys_info["memory_info"] = memory_info
  72. return sys_info