Display Processor progress on stdout

This commit is contained in:
Christophe Bedard 2019-08-07 14:34:28 +02:00 committed by Christophe Bedard
parent 5b8d27e720
commit 6f7a7a6d79

View file

@ -15,6 +15,7 @@
"""Base processor module.""" """Base processor module."""
from collections import defaultdict from collections import defaultdict
import sys
from typing import Callable from typing import Callable
from typing import Dict from typing import Dict
from typing import List from typing import List
@ -258,6 +259,9 @@ class Processor():
expanded_handlers = self._expand_dependencies(*handlers, **kwargs) expanded_handlers = self._expand_dependencies(*handlers, **kwargs)
self._handler_multimap = self._get_handler_maps(expanded_handlers) self._handler_multimap = self._get_handler_maps(expanded_handlers)
self._register_with_handlers(expanded_handlers) self._register_with_handlers(expanded_handlers)
self._progress_display = ProcessingProgressDisplay(
[type(handler).__name__ for handler in expanded_handlers],
)
@staticmethod @staticmethod
def _expand_dependencies( def _expand_dependencies(
@ -306,8 +310,10 @@ class Processor():
:param events: the events to process :param events: the events to process
""" """
self._progress_display.set_work_total(len(events))
for event in events: for event in events:
self._process_event(event) self._process_event(event)
self._progress_display.did_work()
def _process_event(self, event: DictEvent) -> None: def _process_event(self, event: DictEvent) -> None:
"""Process a single event.""" """Process a single event."""
@ -339,3 +345,31 @@ class Processor():
raise_if_not_found=False) raise_if_not_found=False)
metadata = EventMetadata(event_name, timestamp, cpu_id, procname, pid, tid) metadata = EventMetadata(event_name, timestamp, cpu_id, procname, pid, tid)
handler_function(event, metadata) handler_function(event, metadata)
class ProcessingProgressDisplay():
def __init__(
self,
processing_elements: List[str],
) -> None:
self.__info_string = '[' + ', '.join(processing_elements) + ']'
self.__progress_count = 0
self.__total_work = 0
self.__work_display_period = 1
def set_work_total(
self,
total: int,
) -> None:
self.__total_work = total
self.__work_display_period = int(self.__total_work / 100.0)
def did_work(
self,
increment: int = 1,
) -> None:
self.__progress_count += increment
if self.__progress_count % self.__work_display_period == 0:
percentage = 100.0 * (float(self.__progress_count) / float(self.__total_work))
sys.stdout.write(f' [{percentage:2.0f}%] {self.__info_string}\r')