def _pool_put(pool_semaphore, tasks, put_to_pool_in, pool_size, id_self, \
                  is_stopping):
        """ 
        (internal) Intended to be run in a seperate thread. Feeds tasks into 
        to the pool whenever semaphore permits. Finishes if self._stopping is 
        set.
        """
        log.debug('NuMap(%s) started pool_putter.' % id_self)
        last_tasks = {}
        for task in xrange(tasks.lenght):
            last_tasks[task] = -1
        stop_tasks = []
        while True:
            # are we stopping the Weaver?
            if is_stopping():
                log.debug('NuMap(%s) pool_putter has been told to stop.' % \
                           id_self)
                tasks.stop()
            # try to get a task
            try:
                log.debug('NuMap(%s) pool_putter waits for next task.' % \
                           id_self)
                task = tasks.next()
                log.debug('NuMap(%s) pool_putter received next task.' % id_self)
            except StopIteration:
                # Weaver raised a StopIteration
                stop_task = tasks.i # current task
                log.debug('NuMap(%s) pool_putter caught StopIteration from task %s.' % \
                                                                  (id_self, stop_task))
                if stop_task not in stop_tasks:
                    # task raised stop for the first time.
                    log.debug('NuMap(%s) pool_putter task %s first-time finished.' % \
                                                           (id_self, stop_task))
                    stop_tasks.append(stop_task)
                    pool_semaphore.acquire()
                    log.debug('NuMap(%s) pool_putter sends a sentinel for task %s.' % \
                                                           (id_self, stop_task))
                    put_to_pool_in((stop_task, None, last_tasks[stop_task]))
                if len(stop_tasks) == tasks.lenght:
                    log.debug('NuMap(%s) pool_putter sent sentinels for all tasks.' % \
                                                                        id_self)
                    # all tasks have been stopped
                    for _worker in xrange(pool_size):
                        put_to_pool_in(None)
                    log.debug('NuMap(%s) pool_putter sent sentinel for %s workers' % \
                                                           (id_self, pool_size))
                    # this kills the pool_putter
                    break
                # multiple StopIterations for a tasks are ignored. 
                # This is for stride.
                continue

            # got task
            last_tasks[tasks.i] = task[-1][0] # last valid result
            log.debug('NuMap(%s) pool_putter waits for semaphore for task %s' % \
                       (id_self, task))
            pool_semaphore.acquire()
            log.debug('NuMap(%s) pool_putter gets semaphore for task %s' % \
                       (id_self, task))
            #gc.disable()
            put_to_pool_in(task)
            #gc.enable()
            log.debug('NuMap(%s) pool_putter submits task %s to worker.' % \
                       (id_self, task))
        log.debug('NuMap(%s) pool_putter returns' % id_self)