on_close() doesn't get called after calling close() · Issue #612 · websocket-client/websocket-client (original) (raw)

code just like:

class MyWS(object): def init(self): self._ws = None def on_close(self): print("closed")

def run(self):
    try:
        # websocket.enableTrace(True)
        self._ws = websocket.WebSocketApp(*******)
        self._ws.on_close = self.on_close
        self._ws.run_forever()
    except Exception:
        pass

After calling run() above and connection successful, I call self._ws.close() somewhere, But on_close() func doesn't get called. What's wrong?
In _app.py:

def close(self, **kwargs):
    """
    close websocket connection.
    """
    self.keep_running = False
    if self.sock:
        self.sock.close(**kwargs)
        self.sock = None

As above, After calling self._ws.close(), self.keep_running is set to False, Then in _app.py:

class Dispatcher: def init(self, app, ping_timeout): self.app = app self.ping_timeout = ping_timeout

def read(self, sock, read_callback, check_callback):
    while self.app.keep_running:
        r, w, e = select.select(
                (self.app.sock.sock, ), (), (), self.ping_timeout)
        if r:
            if not read_callback():
                break
        check_callback()

the while loop in read() func will be over according to self.keep_running. After dispatcher.read(), nothing is going to be done in run_forever() func.

Is there some suggestions? Thks.