moved cpu usage to a grpc call that the gui will listen to, fixed grpc stream typing to be grpc.Future, fixed pygui issue for start callback when a start fails, but there are no exceptions
This commit is contained in:
parent
3544d00431
commit
fff4bd7963
7 changed files with 85 additions and 47 deletions
|
@ -467,7 +467,7 @@ class CoreGrpcClient:
|
|||
session_id: int,
|
||||
handler: Callable[[core_pb2.Event], None],
|
||||
events: List[core_pb2.Event] = None,
|
||||
) -> grpc.Channel:
|
||||
) -> grpc.Future:
|
||||
"""
|
||||
Listen for session events.
|
||||
|
||||
|
@ -484,7 +484,7 @@ class CoreGrpcClient:
|
|||
|
||||
def throughputs(
|
||||
self, session_id: int, handler: Callable[[core_pb2.ThroughputsEvent], None]
|
||||
) -> grpc.Channel:
|
||||
) -> grpc.Future:
|
||||
"""
|
||||
Listen for throughput events with information for interfaces and bridges.
|
||||
|
||||
|
@ -498,6 +498,21 @@ class CoreGrpcClient:
|
|||
start_streamer(stream, handler)
|
||||
return stream
|
||||
|
||||
def cpu_usage(
|
||||
self, delay: int, handler: Callable[[core_pb2.CpuUsageEvent], None]
|
||||
) -> grpc.Future:
|
||||
"""
|
||||
Listen for cpu usage events with the given repeat delay.
|
||||
|
||||
:param delay: delay between receiving events
|
||||
:param handler: handler for every event
|
||||
:return: stream processing events, can be used to cancel stream
|
||||
"""
|
||||
request = core_pb2.CpuUsageRequest(delay=delay)
|
||||
stream = self.stub.CpuUsage(request)
|
||||
start_streamer(stream, handler)
|
||||
return stream
|
||||
|
||||
def add_node(
|
||||
self, session_id: int, node: core_pb2.Node, source: str = None
|
||||
) -> core_pb2.AddNodeResponse:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import logging
|
||||
import time
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict, List, Tuple, Type, Union
|
||||
|
||||
import grpc
|
||||
|
@ -20,6 +21,25 @@ from core.services.coreservices import CoreService
|
|||
WORKERS = 10
|
||||
|
||||
|
||||
class CpuUsage:
|
||||
def __init__(self) -> None:
|
||||
self.stat_file: Path = Path("/proc/stat")
|
||||
self.prev_idle: int = 0
|
||||
self.prev_total: int = 0
|
||||
|
||||
def run(self) -> float:
|
||||
lines = self.stat_file.read_text().splitlines()[0]
|
||||
values = [int(x) for x in lines.split()[1:]]
|
||||
idle = sum(values[3:5])
|
||||
non_idle = sum(values[:3] + values[5:8])
|
||||
total = idle + non_idle
|
||||
total_diff = total - self.prev_total
|
||||
idle_diff = idle - self.prev_idle
|
||||
self.prev_idle = idle
|
||||
self.prev_total = total
|
||||
return (total_diff - idle_diff) / total_diff
|
||||
|
||||
|
||||
def add_node_data(node_proto: core_pb2.Node) -> Tuple[NodeTypes, int, NodeOptions]:
|
||||
"""
|
||||
Convert node protobuf message to data for creating a node.
|
||||
|
|
|
@ -681,6 +681,15 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
last_stats = stats
|
||||
time.sleep(delay)
|
||||
|
||||
def CpuUsage(
|
||||
self, request: core_pb2.CpuUsageRequest, context: ServicerContext
|
||||
) -> None:
|
||||
cpu_usage = grpcutils.CpuUsage()
|
||||
while self._is_running(context):
|
||||
usage = cpu_usage.run()
|
||||
yield core_pb2.CpuUsageEvent(usage=usage)
|
||||
time.sleep(request.delay)
|
||||
|
||||
def AddNode(
|
||||
self, request: core_pb2.AddNodeRequest, context: ServicerContext
|
||||
) -> core_pb2.AddNodeResponse:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue