Starts the processes or threads in the internal pool and the threads, 
        which manage the **worker pool** input and output queues. The 
        **starting mode** is split into **two stages**, which can be initiated 
        seperately. After the first stage the **worker pool** processes or 
        threads are  started and the ``NuMap._started`` event is set ``True``.
        A call to the ``NuMap.next`` method **will** block. After the **second 
        stage** the ``NuMap._pool_putter`` and ``NuMap._pool_getter`` threads
        will be running. The ``NuMap.next`` method should only be called **after** 
        this method returns.

        Arguments:
        
          - stages (``tuple``) [default: ``(1, 2)``] Specifies which stages of 
            the start process to execute, by default both stages.

def start(self, stages=(1, 2)):
        """
        Starts the processes or threads in the internal pool and the threads, 
        which manage the **worker pool** input and output queues. The 
        **starting mode** is split into **two stages**, which can be initiated 
        seperately. After the first stage the **worker pool** processes or 
        threads are  started and the ``NuMap._started`` event is set ``True``.
        A call to the ``NuMap.next`` method **will** block. After the **second 
        stage** the ``NuMap._pool_putter`` and ``NuMap._pool_getter`` threads
        will be running. The ``NuMap.next`` method should only be called **after** 
        this method returns.

        Arguments:
        
          - stages (``tuple``) [default: ``(1, 2)``] Specifies which stages of 
            the start process to execute, by default both stages.

        """
        if 1 in stages:
            if not self._started.isSet():
                self._start_workers()
                self._started.set()
        if 2 in stages:
            if not hasattr(self, '_pool_getter'):
                self._start_managers()