class_docstr: Measures time (resets if given interval elapses) on rank 0
  and propagates result to other ranks.
  Propagation is done asynchronously from previous step
  in order to avoid blocking of a training process.
code: def check(self) -> bool:
      ret = False
      curr_time = perf_counter()
  
      if self._prev_work is not None:
          # pyre-fixme[16]: `Variable[AsyncOperator]` has no attribute wait.
          self._prev_work.wait()
          ret = self._timeout_tensor[0].item() == 1
          if ret:
              self._prev_time = curr_time
  
      self._timeout_tensor[0] = (
          1
          if (curr_time - self._prev_time)
          >= self._interval.total_seconds()
          else 0
      )
      self._prev_work = dist.broadcast(
          self._timeout_tensor, 0, group=self._cpu_pg, async_op=True
      )
  
      return ret
  
imports: import datetime
  import logging
  import os
  from collections import defaultdict
  from contextlib import contextmanager
  from time import perf_counter
  from typing import Any, Dict, Generator, List, Optional, Protocol, runtime_checkable, Sequence, Tuple, TypeVar
  import numpy
  import torch
  import torch.distributed
  from tabulate import tabulate
  from torchtnt.utils.distributed import PGWrapper
label_desc: Use image node_id 2 for calling the FullSyncPeriodicTimer obj's underlying member method code with example usage: obj.check() and returns: ret