Joins blocking until the interval ends or until timeout is reached.

    Args:
      timeout_s: The time in seconds to wait, defaults to forever.
    Returns:
      True if the interval is still running and we reached the timeout.

def join(self, timeout_s=None):
    """Joins blocking until the interval ends or until timeout is reached.

    Args:
      timeout_s: The time in seconds to wait, defaults to forever.
    Returns:
      True if the interval is still running and we reached the timeout.
    """
    if not self.thread:
      return False
    self.thread.join(timeout_s)
    return self.running