code: async def _run_socket(self):
          
          try:
              while True:
                  message = await ZMQUtils.recv(self._socket)
                  msg_class = message.__msgtype__
                  if msg_class in self._handlers_registered:
                      # If a handler is registered, give the message to it
                      self._loop.create_task(self._handlers_registered[msg_class](message))
                  elif msg_class in self._transactions:
                      # If there are transaction associated, check if the key is ok
                      _1, get_key, coroutine_recv, _2, responsible = self._msgs_registered[msg_class]
                      key = get_key(message)
                      if key in self._transactions[msg_class]:
                          # key exists; call all the coroutines
                          for args, kwargs in self._transactions[msg_class][key]:
                              self._loop.create_task(coroutine_recv(message, *args, **kwargs))
                          # remove all transaction parts
                          for key2 in responsible:
                              del self._transactions[key2][key]
                      else:
                          # key does not exist
                          raise Exception("Received message %s for an unknown transaction %s", msg_class, key)
                  else:
                      raise Exception("Received unknown message %s", msg_class)
          except asyncio.CancelledError:
              return
          except KeyboardInterrupt:
              return
docs: Task that runs this client.