class_docstr: Wrapper object that creates a thread, that pulls parameters and pushes
  gradients, in a loop.
class_docstr_tok: ["Wrapper","object","that","creates","a","thread",",","that","pulls","parameters","and","pushes","gradients",",","in","a","loop","."]
code: def __init__(
      self,
      process_name: str,
      client_rank: Rank,
      all_server_ranks: List[Rank],
      init_method: Optional[str],
      world_size: int,
      groups: List[List[Rank]],
      subprocess_init: Optional[Callable[[], None]] = None,
  ) -> None:
      self.q = mp.get_context("spawn").Queue()
      self.errq = mp.get_context("spawn").Queue()
      self.p = mp.get_context("spawn").Process(
          name=process_name,
          target=_client_thread_loop,
          args=(
              process_name,
              client_rank,
              all_server_ranks,
              self.q,
              self.errq,
              init_method,
              world_size,
              groups,
              subprocess_init,
          ),
      )
      self.p.daemon = True
      self.p.start()
  
imports: import logging
  import multiprocessing
  import queue
  import time
  import traceback
  from functools import lru_cache
  from typing import Callable, Dict, List, Optional, Sequence
  import torch
  import torch.distributed
  import torch.multiprocessing
  from torchbiggraph.distributed import init_process_group, Startable
  from torchbiggraph.types import CharTensorType, Rank
  from torchbiggraph.util import allocate_shared_tensor, split_almost_equally, tag_logs_with_process_name
label_desc: Use image node_id 1 to create a new ParameterSharer object  with example: obj = ParameterSharer(process_name, client_rank, all_server_ranks, init_method, world_size, groups, subprocess_init)