class_docstr: Base class for all DataFlow 
docstr: * A dataflow is an iterable. The :meth:`__iter__` method should yield a list or dict each time.
    Note that dict is **partially** supported at the moment: certain dataflow does not support dict.
  
  * The :meth:`__iter__` method can be either finite (will stop iteration) or infinite
    (will not stop iteration). For a finite dataflow, :meth:`__iter__` can be called
    again immediately after the previous call returned.
  
  * For many dataflow, the :meth:`__iter__` method is non-reentrant, which means for an dataflow
    instance ``df``, :meth:`df.__iter__` cannot be called before the previous
    :meth:`df.__iter__` call has finished (iteration has stopped).
    When a dataflow is non-reentrant, :meth:`df.__iter__` should throw an exception if
    called before the previous call has finished.
    For such non-reentrant dataflows, if you need to use the same dataflow in two places,
    you need to create two dataflow instances.
  
  Yields:
      list/dict: The datapoint, i.e. list/dict of components.
docstr_tok: ["*","A","dataflow","is","an","iterable",".","The",":","meth",":","`","__iter__","`","method","should","yield","a","list","or","dict","each","time",".","Note","that","dict","is","*","*","partially","*","*","supported","at","the","moment",":","certain","dataflow","does","not","support","dict",".","*","The",":","meth",":","`","__iter__","`","method","can","be","either","finite","(","will","stop","iteration",")","or","infinite","(","will","not","stop","iteration",")",".","For","a","finite","dataflow",",",":","meth",":","`","__iter__","`","can","be","called","again","immediately","after","the","previous","call","returned",".","*","For","many","dataflow",",","the",":","meth",":","`","__iter__","`","method","is","non-reentrant",",","which","means","for","an","dataflow","instance","``","df","``",",",":","meth",":","`","df.__iter__","`","can","not","be","called","before","the","previous",":","meth",":","`","df.__iter__","`","call","has","finished","(","iteration","has","stopped",")",".","When","a","dataflow","is","non-reentrant",",",":","meth",":","`","df.__iter__","`","should","throw","an","exception","if","called","before","the","previous","call","has","finished",".","For","such","non-reentrant","dataflows",",","if","you","need","to","use","the","same","dataflow","in","two","places",",","you","need","to","create","two","dataflow","instances",".","Yields",":","list\/dict",":","The","datapoint",",","i.e",".","list\/dict","of","components","."]
code: def __iter__(self):
      """
      * A dataflow is an iterable. The :meth:`__iter__` method should yield a list or dict each time.
        Note that dict is **partially** supported at the moment: certain dataflow does not support dict.
  
      * The :meth:`__iter__` method can be either finite (will stop iteration) or infinite
        (will not stop iteration). For a finite dataflow, :meth:`__iter__` can be called
        again immediately after the previous call returned.
  
      * For many dataflow, the :meth:`__iter__` method is non-reentrant, which means for an dataflow
        instance ``df``, :meth:`df.__iter__` cannot be called before the previous
        :meth:`df.__iter__` call has finished (iteration has stopped).
        When a dataflow is non-reentrant, :meth:`df.__iter__` should throw an exception if
        called before the previous call has finished.
        For such non-reentrant dataflows, if you need to use the same dataflow in two places,
        you need to create two dataflow instances.
  
      Yields:
          list/dict: The datapoint, i.e. list/dict of components.
      """
  
imports: import threading
  from abc import ABCMeta, abstractmethod
  import six
  from ..utils.utils import get_rng
label_desc: Use image node_id 1 for calling the DataFlow obj's underlying member method code with example usage: obj.__iter__() without return types