code: def _scatter_list(self, data, owner):
          
  
          rank = self.comm.rank
          size = self.comm.size
          subject_submatrices = []
          nblocks = self.comm.bcast(len(data)
                                    if rank == owner else None, root=owner)
  
          # For each submatrix
          for idx in range(0, nblocks, size):
              padded = None
              extra = max(0, idx+size - nblocks)
  
              # Pad with "None" so scatter can go to all processes
              if data is not None:
                  padded = data[idx:idx+size]
                  if extra > 0:
                      padded = padded + [None]*extra
  
              # Scatter submatrices to all processes
              mytrans = self.comm.scatter(padded, root=owner)
  
              # Contribute submatrix to subject list
              if mytrans is not None:
                  subject_submatrices += [mytrans]
  
          return subject_submatrices
docs: Distribute a list from one rank to other ranks in a cyclic manner
  
          Parameters
          ----------
  
          data: list of pickle-able data
  
          owner: rank that owns the data
  
          Returns
          -------
  
          A list containing the data in a cyclic layout across ranks