class_docstr: Interface definition of all communicators.
  
  All communicators that have compatible set of methods with this
  class is supposed to work in ChainerMN's parallel computation
  implementation. The methods are named after MPI functions, such
  as ``bcast()`` came from ``MPI_Bcast()``.
  
  There are two types of methods: one that treats Python objects
  have ``_obj`` suffix.  The other has methods without any suffix
  and it handles ndarray and arrays filled with scaler values.  So
  the number of methods would be ::
  
      [send, recv, bcast, gather, allreduce] * [ '_obj', '']
  
  
  (with single exception ``alltoall``, ``multi_node_mean_grad``, ``split``
  and ``bcast_data`` so far). Also methods are supposed to be
  written in this order. All those methods must be implemented in
  its implementation class, or otherwise it cannot be instantiated
  in runtime.
  
  .. note:: As most implementation of ``_obj``-sufficed methods
    involves Python object pickling and unpickling, there is an
    implicit size limit.
  
  TODO(kuenishi): as of now no implementation class actually has
  ``allreduce`` method.
docstr: Number of processes of the cluster.
docstr_tok: ["Number","of","processes","of","the","cluster","."]
code: def size(self):
      """Number of processes of the cluster."""
      raise NotImplementedError()
  
imports: from abc import ABCMeta
  from abc import abstractmethod
  import contextlib
  import six
  import warnings
label_desc: Use image node_id 3 for calling the CommunicatorBase obj's underlying member method code with example usage: obj.size() without return types