class_docstr: Create a ring of nodes (processes). Each node runs a copy of the same
  function.
  
  :param processes: Number of ring nodes in this Ring.
  :param func: the target function that each ring node will run.
  :param initializer: the initialization function that each ring node runs.
      This is used to setup the custom ring structure like PyTorch's
      torch.distributed, Horovod, etc.
  :param initargs: positional arguments that are passed to initializer.
      Currently this is not used.
class_docstr_tok: ["Create","a","ring","of","nodes","(","processes",")",".","Each","node","runs","a","copy","of","the","same","function",".",":","param","processes",":","Number","of","ring","nodes","in","this","Ring",".",":","param","func",":","the","target","function","that","each","ring","node","will","run",".",":","param","initializer",":","the","initialization","function","that","each","ring","node","runs",".","This","is","used","to","setup","the","custom","ring","structure","like","PyTorch's","torch.distributed",",","Horovod",",","etc",".",":","param","initargs",":","positional","arguments","that","are","passed","to","initializer",".","Currently","this","is","not","used","."]
docstr: Start this Ring. This will start the ring 0 process on the same machine
  and start all the other ring nodes with Fiber processes.
docstr_tok: ["Start","this","Ring",".","This","will","start","the","ring","0","process","on","the","same","machine","and","start","all","the","other","ring","nodes","with","Fiber","processes","."]
code: def run(self):
      """
      Start this Ring. This will start the ring 0 process on the same machine
      and start all the other ring nodes with Fiber processes.
      """
      if self.size <= 0:
          return
  
      procs = []
      rank = self.rank
      # Start process rank 0
      self.rank = 0
      ctx = mp.get_context("spawn")
      p = ctx.Process(target=self._target)
      p.start()
      procs.append(p)
  
      for i in range(1, self.size):
          self.rank = i
          p = fiber.Process(target=self._target)
          p.start()
          procs.append(p)
  
      self.rank = rank
      # wait for all processes to finish
      for i in range(self.size):
          procs[i].join()
  
file_path: fiber/fiber/experimental/ring.py
imports: import multiprocessing
  import random
  import fiber
  from fiber.backend import get_backend
label_desc: Use image node_id 3 for calling the Ring obj's underlying member method code with example usage: obj.run() without return types