@@ -188,6 +188,7 @@ def __init__(
188
188
self ._receive_thread : Optional [threading .Thread ] = None
189
189
self ._completed_events : Set [WebsocketsEventType ] = set ()
190
190
self ._completed_event = threading .Event ()
191
+ self ._join_event = threading .Event ()
191
192
192
193
@contextmanager
193
194
def __call__ (self ):
@@ -236,37 +237,44 @@ def close(self) -> None:
236
237
if self ._state not in (self .State .CONNECTED , self .State .CONNECTING ):
237
238
return
238
239
self ._state = self .State .CLOSING
240
+ self ._join_event .set ()
239
241
self ._close ()
240
242
self ._state = self .State .CLOSED
241
243
242
244
def _send_loop (self ) -> None :
243
245
try :
244
- while True :
245
- event = self ._input_queue .get ()
246
- self ._send_event (event )
247
- self ._input_queue .task_done ()
246
+ while not self ._join_event .is_set ():
247
+ try :
248
+ event = self ._input_queue .get (timeout = 0.5 )
249
+ self ._send_event (event )
250
+ self ._input_queue .task_done ()
251
+ except queue .Empty :
252
+ pass
248
253
except Exception as e :
249
254
self ._handle_error (e )
250
255
251
256
def _receive_loop (self ) -> None :
252
257
try :
253
- while True :
258
+ while not self . _join_event . is_set () :
254
259
if not self ._ws :
255
260
log_debug ("[%s] empty websocket conn, close" , self ._path )
256
261
break
257
262
258
- data = self ._ws .recv ()
259
- message = json .loads (data )
260
- event_type = message .get ("event_type" )
261
- log_debug ("[%s] receive event, type=%s, event=%s" , self ._path , event_type , data )
262
-
263
- event = self ._load_all_event (message )
264
- if event :
265
- handler = self ._on_event .get (event_type )
266
- if handler :
267
- handler (self , event )
268
- self ._completed_events .add (event_type )
269
- self ._completed_event .set ()
263
+ try :
264
+ data = self ._ws .recv (timeout = 0.5 )
265
+ message = json .loads (data )
266
+ event_type = message .get ("event_type" )
267
+ log_debug ("[%s] receive event, type=%s, event=%s" , self ._path , event_type , data )
268
+
269
+ event = self ._load_all_event (message )
270
+ if event :
271
+ handler = self ._on_event .get (event_type )
272
+ if handler :
273
+ handler (self , event )
274
+ self ._completed_events .add (event_type )
275
+ self ._completed_event .set ()
276
+ except TimeoutError :
277
+ pass
270
278
except Exception as e :
271
279
self ._handle_error (e )
272
280
0 commit comments