diff mbox series

[4/5] rteval: Break out of main loop faster on interrupt/stoptime

Message ID 20240304211655.20174-5-crwood@redhat.com
State New
Headers show
Series rteval: Fixes and speedups | expand

Commit Message

Crystal Wood March 4, 2024, 9:16 p.m. UTC
Waiting up to a full minute for rteval to stop on ctrl-c can be
frustrating.  Likewise, if a very short run is requested
(e.g. for testing rteval itself) rounding it up to a minute is
not polite.

Signed-off-by: Crystal Wood <crwood@redhat.com>
---
 rteval/__init__.py | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

Comments

John Kacur April 2, 2024, 8:39 p.m. UTC | #1
On Mon, 4 Mar 2024, Crystal Wood wrote:

> Waiting up to a full minute for rteval to stop on ctrl-c can be
> frustrating.  Likewise, if a very short run is requested
> (e.g. for testing rteval itself) rounding it up to a minute is
> not polite.
> 
> Signed-off-by: Crystal Wood <crwood@redhat.com>
> ---
>  rteval/__init__.py | 11 +++++------
>  1 file changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/rteval/__init__.py b/rteval/__init__.py
> index 5d43615af5bb..72e3412a860e 100644
> --- a/rteval/__init__.py
> +++ b/rteval/__init__.py
> @@ -32,12 +32,11 @@ RTEVAL_VERSION = version.RTEVAL_VERSION
>  
>  earlystop = False
>  
> -stopsig_received = False
> +stopsig = threading.Event()
>  def sig_handler(signum, frame):
>      """ Handle SIGINT (CTRL + C) or SIGTERM (Termination signal) """
>      if signum in (signal.SIGINT, signal.SIGTERM):
> -        global stopsig_received
> -        stopsig_received = True
> +        stopsig.set()
>          print("*** stop signal received - stopping rteval run ***")
>      else:
>          raise RuntimeError(f"SIGNAL received! ({signum})")
> @@ -208,8 +207,8 @@ class RtEval(rtevalReport):
>              currtime = time.time()
>              rpttime = currtime + report_interval
>              load_avg_checked = 5
> -            while (currtime <= stoptime) and not stopsig_received:
> -                time.sleep(60.0)
> +            while (currtime <= stoptime) and not stopsig.is_set():
> +                stopsig.wait(min(stoptime - currtime, 60.0))
>                  if not measure_profile.isAlive():
>                      stoptime = currtime
>                      earlystop = True
> @@ -238,7 +237,7 @@ class RtEval(rtevalReport):
>              signal.signal(signal.SIGTERM, signal.SIG_DFL)
>  
>          except RuntimeError as err:
> -            if not stopsig_received:
> +            if not stopsig.is_set():
>                  raise RuntimeError(f"appeared during measurement: {err}")
>  
>          finally:
> -- 

Signed-off-by: John Kacur <jkacur@redhat.com>
diff mbox series

Patch

diff --git a/rteval/__init__.py b/rteval/__init__.py
index 5d43615af5bb..72e3412a860e 100644
--- a/rteval/__init__.py
+++ b/rteval/__init__.py
@@ -32,12 +32,11 @@  RTEVAL_VERSION = version.RTEVAL_VERSION
 
 earlystop = False
 
-stopsig_received = False
+stopsig = threading.Event()
 def sig_handler(signum, frame):
     """ Handle SIGINT (CTRL + C) or SIGTERM (Termination signal) """
     if signum in (signal.SIGINT, signal.SIGTERM):
-        global stopsig_received
-        stopsig_received = True
+        stopsig.set()
         print("*** stop signal received - stopping rteval run ***")
     else:
         raise RuntimeError(f"SIGNAL received! ({signum})")
@@ -208,8 +207,8 @@  class RtEval(rtevalReport):
             currtime = time.time()
             rpttime = currtime + report_interval
             load_avg_checked = 5
-            while (currtime <= stoptime) and not stopsig_received:
-                time.sleep(60.0)
+            while (currtime <= stoptime) and not stopsig.is_set():
+                stopsig.wait(min(stoptime - currtime, 60.0))
                 if not measure_profile.isAlive():
                     stoptime = currtime
                     earlystop = True
@@ -238,7 +237,7 @@  class RtEval(rtevalReport):
             signal.signal(signal.SIGTERM, signal.SIG_DFL)
 
         except RuntimeError as err:
-            if not stopsig_received:
+            if not stopsig.is_set():
                 raise RuntimeError(f"appeared during measurement: {err}")
 
         finally: