@@ -31,25 +31,37 @@ def start_heartbeater(
3131 stop_evt = threading .Event ()
3232 flags : Dict [str , bool ] = {"lost" : False }
3333
34+ def _lost (msg : str ) -> bool :
35+ msg_u = (msg or "" ).upper ()
36+ return ("NOT_ACTIVE" in msg_u ) or ("TOKEN_MISMATCH" in msg_u )
37+
3438 def hb_loop ():
3539 try :
3640 client .heartbeat (queue = queue , job_id = job_id , lease_token = lease_token )
3741 except Exception as e :
42+ if stop_evt .is_set ():
43+ return
3844 msg = str (e )
39- if "NOT_ACTIVE" in msg or "TOKEN_MISMATCH" in msg :
45+ if _lost ( msg ) :
4046 flags ["lost" ] = True
4147 stop_evt .set ()
4248 return
49+ time .sleep (min (0.2 , max (0.01 , float (interval_s ))))
4350
44- while not stop_evt .wait (interval_s ):
51+ while True :
52+ if stop_evt .wait (interval_s ):
53+ return
4554 try :
4655 client .heartbeat (queue = queue , job_id = job_id , lease_token = lease_token )
4756 except Exception as e :
57+ if stop_evt .is_set ():
58+ return
4859 msg = str (e )
49- if "NOT_ACTIVE" in msg or "TOKEN_MISMATCH" in msg :
60+ if _lost ( msg ) :
5061 flags ["lost" ] = True
5162 stop_evt .set ()
5263 return
64+ time .sleep (min (0.2 , max (0.01 , float (interval_s ))))
5365
5466 t = threading .Thread (target = hb_loop , daemon = True )
5567 t .start ()
@@ -93,37 +105,35 @@ def consume(
93105
94106 ctrl = StopController (stop = False , sigint_count = 0 )
95107
96- if stop_on_ctrl_c and threading .current_thread () is threading .main_thread ():
97- def on_sigterm (signum , _frame ):
98- ctrl .stop = True
99- if verbose :
100- _safe_log (logger , f"[consume] SIGTERM received; stopping... queue={ queue } " )
108+ prev_sigterm = None
109+ prev_sigint = None
101110
102- signal .signal (signal .SIGTERM , on_sigterm )
111+ try :
112+ if stop_on_ctrl_c and threading .current_thread () is threading .main_thread ():
113+ def on_sigterm (signum , _frame ):
114+ ctrl .stop = True
115+ if verbose :
116+ _safe_log (logger , f"[consume] SIGTERM received; stopping... queue={ queue } " )
103117
104- if drain :
105- prev = signal .getsignal (signal .SIGINT )
118+ prev_sigterm = signal . getsignal ( signal . SIGTERM )
119+ signal .signal (signal .SIGTERM , on_sigterm )
106120
107- def on_sigint (signum , frame ):
108- ctrl .sigint_count += 1
109- if ctrl .sigint_count >= 2 :
110- if verbose :
111- _safe_log (logger , f"[consume] SIGINT x2; hard exit now. queue={ queue } " )
112- try :
113- signal .signal (signal .SIGINT , prev if prev else signal .SIG_DFL )
114- except Exception :
115- signal .signal (signal .SIGINT , signal .SIG_DFL )
116- raise KeyboardInterrupt
121+ if drain :
122+ prev_sigint = signal .getsignal (signal .SIGINT )
117123
118- ctrl .stop = True
119- if verbose :
120- _safe_log (logger , f"[consume] Ctrl+C received; draining current job then exiting. queue={ queue } " )
124+ def on_sigint (signum , frame ):
125+ ctrl .sigint_count += 1
126+ if ctrl .sigint_count >= 2 :
127+ if verbose :
128+ _safe_log (logger , f"[consume] SIGINT x2; hard exit now. queue={ queue } " )
129+ raise KeyboardInterrupt
121130
122- signal .signal (signal .SIGINT , on_sigint )
123- else :
124- pass
131+ ctrl .stop = True
132+ if verbose :
133+ _safe_log (logger , f"[consume] Ctrl+C received; draining current job then exiting. queue={ queue } " )
134+
135+ signal .signal (signal .SIGINT , on_sigint )
125136
126- try :
127137 while True :
128138 if ctrl .stop :
129139 if verbose :
@@ -214,8 +224,6 @@ def on_sigint(signum, frame):
214224 try :
215225 handler (ctx )
216226
217- hb .stop_evt .set ()
218-
219227 if not hb .flags .get ("lost" , False ):
220228 try :
221229 client .ack_success (queue = queue , job_id = res .job_id , lease_token = res .lease_token )
@@ -228,12 +236,9 @@ def on_sigint(signum, frame):
228236 except KeyboardInterrupt :
229237 if verbose :
230238 _safe_log (logger , f"[consume] KeyboardInterrupt; exiting now. queue={ queue } " )
231- hb .stop_evt .set ()
232239 return
233240
234241 except Exception as e :
235- hb .stop_evt .set ()
236-
237242 if not hb .flags .get ("lost" , False ):
238243 try :
239244 err = f"{ type (e ).__name__ } : { e } "
@@ -255,7 +260,12 @@ def on_sigint(signum, frame):
255260
256261 finally :
257262 try :
258- hb .thread .join (timeout = 0.1 )
263+ hb .stop_evt .set ()
264+ except Exception :
265+ pass
266+ try :
267+ join_timeout = max (0.2 , min (2.0 , hb_s * 1.5 ))
268+ hb .thread .join (timeout = join_timeout )
259269 except Exception :
260270 pass
261271
@@ -268,3 +278,21 @@ def on_sigint(signum, frame):
268278 if verbose :
269279 _safe_log (logger , f"[consume] KeyboardInterrupt (outer); exiting now. queue={ queue } " )
270280 return
281+
282+ finally :
283+ if stop_on_ctrl_c and threading .current_thread () is threading .main_thread ():
284+ try :
285+ if prev_sigterm is not None :
286+ signal .signal (signal .SIGTERM , prev_sigterm )
287+ except Exception :
288+ pass
289+ try :
290+ if prev_sigint is not None :
291+ signal .signal (signal .SIGINT , prev_sigint )
292+ except Exception :
293+ pass
294+
295+ try :
296+ client .close ()
297+ except Exception :
298+ pass
0 commit comments