docs: def recv(self, timeout=None):
          """Receive, optionally with *timeout* in seconds.
          """
          if timeout:
              timeout *= 1000.
  
          for sub in list(self.subscribers) + self._hooks:
              self.poller.register(sub, POLLIN)
          self._loop = True
          try:
              while self._loop:
                  sleep(0)
                  try:
                      socks = dict(self.poller.poll(timeout=timeout))
                      if socks:
                          for sub in self.subscribers:
                              if sub in socks and socks[sub] == POLLIN:
                                  m__ = Message.decode(sub.recv_string(NOBLOCK))
                                  if not self._filter or self._filter(m__):
                                      if self._translate:
                                          url = urlsplit(self.sub_addr[sub])
                                          host = url[1].split(":")[0]
                                          m__.sender = (m__.sender.split("@")[0]
                                                        + "@" + host)
                                      yield m__
  
                          for sub in self._hooks:
                              if sub in socks and socks[sub] == POLLIN:
                                  m__ = Message.decode(sub.recv_string(NOBLOCK))
                                  self._hooks_cb[sub](m__)
                      else:
                          # timeout
                          yield None
                  except ZMQError as err:
                      LOGGER.exception("Receive failed: %s", str(err))
          finally:
              for sub in list(self.subscribers) + self._hooks:
                  self.poller.unregister(sub)