7832: Add __slots__ and remove __del__ which interfers with garbage collection. ...
[arvados.git] / sdk / python / arvados / events.py
index 965db2f2333baf60599f6697dc0cd193fea16469..3132da3a0a2e271350c1a5418efa577703555231 100644 (file)
@@ -29,19 +29,23 @@ class EventClient(WebSocketClient):
         self.filters = filters
         self.on_event = on_event
         self.last_log_id = last_log_id
+        self._closed_lock = threading.RLock()
+        self._closed = False
 
     def opened(self):
         self.subscribe(self.filters, self.last_log_id)
 
     def received_message(self, m):
-        self.on_event(json.loads(str(m)))
+        with self._closed_lock:
+            if not self._closed:
+                self.on_event(json.loads(str(m)))
 
-    def close_connection(self):
-        try:
-            self.sock.shutdown(socket.SHUT_RDWR)
-            self.sock.close()
-        except:
-            pass
+    def close(self, code=1000, reason=''):
+        """Close event client and wait for it to finish."""
+        super(EventClient, self).close(code, reason)
+        with self._closed_lock:
+            # make sure we don't process any more messages.
+            self._closed = True
 
     def subscribe(self, filters, last_log_id=None):
         m = {"method": "subscribe", "filters": filters}
@@ -100,6 +104,8 @@ class PollClient(threading.Thread):
             self.stop.wait(1)
 
     def close(self):
+        """Close poll client and wait for it to finish."""
+
         self.stop.set()
         try:
             self.join()