class_docstr: Implementation of the Communicator class via torch.distributed. Use this
  communicator to communicate between different processes, potentially,
  running on different nodes.
docstr: Scatters a list of tensors to all parties.
code: def scatter(self, scatter_list, src, size=None, device=None):
      """Scatters a list of tensors to all parties."""
      assert dist.is_initialized(), "initialize the communicator first"
      if src != self.get_rank():
          if size is None:
              size = scatter_list[self.get_rank()].size()
          if device is None:
              try:
                  device = scatter_list[self.get_rank()].device
              except Exception:
                  pass
          tensor = torch.empty(
              size=size, dtype=torch.long, device=device
          )
          dist.scatter(tensor.data, [], src, group=self.main_group)
      else:
          scatter_list = [s.data for s in scatter_list]
          tensor = scatter_list[self.get_rank()]
          dist.scatter(
              tensor.data, scatter_list, src, group=self.main_group
          )
      return tensor
  
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 10 for calling the DistributedCommunicator obj's underlying member method code with example usage: obj.scatter(scatter_list, src, size, device) and returns: tensor