class_docstr: Implementation of the Communicator class via torch.distributed. Use this
  communicator to communicate between different processes, potentially,
  running on different nodes.
docstr: Gathers a list of tensors in a single party.
code: def gather(self, tensor, dst):
      """Gathers a list of tensors in a single party."""
      assert dist.is_initialized(), "initialize the communicator first"
      if self.get_rank() == dst:
          result = []
          device = tensor.data.device
          for _ in range(self.get_world_size()):
              result.append(
                  torch.empty(
                      size=tensor.size(),
                      dtype=torch.long,
                      device=device,
                  )
              )
          dist.gather(tensor.data, result, dst, group=self.main_group)
          return result
      dist.gather(tensor.data, [], dst, group=self.main_group)
      return [None]
  
imports: import logging
  import os
  import pickle
  import random
  import string
  import numpy
  import torch
  import torch.distributed
  from crypten.common import serial
  from torch.distributed import ReduceOp
  from .communicator import _logging, Communicator
label_desc: Use image node_id 13 for calling the DistributedCommunicator obj's underlying member method code with example usage: obj.gather(tensor, dst) and returns: list, result