From 89c9d534e2a2f0ed12743d99b5de89320890b1cc Mon Sep 17 00:00:00 2001 From: bd Date: Fri, 19 Sep 2025 15:09:21 -0400 Subject: Add basic throughput to report --- nemesis/causal_event_loop.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'nemesis/causal_event_loop.py') diff --git a/nemesis/causal_event_loop.py b/nemesis/causal_event_loop.py index 8514dfc..1a9be98 100644 --- a/nemesis/causal_event_loop.py +++ b/nemesis/causal_event_loop.py @@ -52,6 +52,8 @@ class CausalEventLoop(asyncio.SelectorEventLoop): _time_fd_registered = dict() _time_entered_coro = None _accumulated_time = 0 + _num_processed_tasks = 0 + _total_time_in_coro = 0 _time_dilation = 1.0 _processing = collections.deque() @@ -63,12 +65,22 @@ class CausalEventLoop(asyncio.SelectorEventLoop): _select = self._selector.select def select(timeout: float): - return _select(timeout / self._time_dilation) + return _select(None if timeout == None else timeout / self._time_dilation) self._selector.select = select - def _set_dilation(self, dilation): + def set_dilation(self, dilation): self._time_dilation = dilation + + # reset experiment counters self._time_entered_coro = None + self._num_processed_tasks = 0 + self._total_time_in_coro = 0 + + def get_time_in_coro(self): + return self.total_time_in_coro + + def get_num_processed_tasks(self): + return self._num_processed_tasks def _get_time_in_coro(self): t = self._accumulated_time @@ -168,10 +180,16 @@ class CausalEventLoop(asyncio.SelectorEventLoop): logger.warning('Executing %s took %.3f seconds', _format_handle(handle), dt * 1/self._time_dilation) + time_inside_coro = self._get_time_in_coro() + + # update stat counters + self._total_time_in_coro += time_inside_coro + self._num_processed_tasks += 1 + # calculate the amount of time to slow this callback down by. We only want # to add time proportionate to the amount of time spent OUTSIDE of the # coroutine of interest. - time_outside_coro = dt - self._get_time_in_coro() + time_outside_coro = dt - time_inside_coro delay = time_outside_coro * (1 / self._time_dilation - 1) t0 = super().time() # do it this way so the python interpreter still receives signals. -- cgit v1.2.3