import psutil
import time
import threading

class SystemMonitor:
    def __init__(self, update_interval=5):
        self.update_interval = update_interval
        self.cpu_usage = 0.0
        self.memory_usage = 0.0
        self.network_io = (0, 0)  # (bytes_sent, bytes_received)
        self._stop_event = threading.Event()
        self._thread = threading.Thread(target=self._monitor_loop, daemon=True)

    def start(self):
        self._thread.start()

    def stop(self):
        self._stop_event.set()
        self._thread.join()

    def _monitor_loop(self):
        while not self._stop_event.is_set():
            self.cpu_usage = psutil.cpu_percent(interval=1)
            self.memory_usage = psutil.virtual_memory().percent
            net_io = psutil.net_io_counters()
            self.network_io = (net_io.bytes_sent, net_io.bytes_recv)
            time.sleep(self.update_interval)

    def get_metrics(self):
        return {
            'cpu_usage': self.cpu_usage,
            'memory_usage': self.memory_usage,
            'network_io': self.network_io
        }

if __name__ == '__main__':
    monitor = SystemMonitor()
    monitor.start()
    try:
        while True:
            metrics = monitor.get_metrics()
            print(f"CPU Usage: {metrics['cpu_usage']}%")
            print(f"Memory Usage: {metrics['memory_usage']}%")
            print(f"Network I/O: {metrics['network_io']}")
            time.sleep(5)
    except KeyboardInterrupt:
        monitor.stop()
        print("Monitoring stopped.")