The actual processing for the main loop is here.

        Running the main loop as a generator (where a iteration is a full
        sched, proactor and timers/timeouts run) is usefull for interleaving
        the main loop with other applications that have a blocking main loop and
        require cogen to run in the same thread.

def iter_run(self):
        """
        The actual processing for the main loop is here.

        Running the main loop as a generator (where a iteration is a full
        sched, proactor and timers/timeouts run) is usefull for interleaving
        the main loop with other applications that have a blocking main loop and
        require cogen to run in the same thread.
        """
        self.running = True
        urgent = None
        while self.running and (self.active or self.proactor or self.timeouts or urgent):
            if self.active or urgent:
                op, coro = urgent or self.active.popleft()
                urgent = None
                while True:
                    op, coro = self.process_op(coro.run_op(op, self), coro)
                    if not op and not coro:
                        break

            if (self.proactor_greedy or not self.active) and self.proactor:
                try:
                    urgent = self.proactor.run(timeout = self.next_timer_delta())
                except (OSError, select.error, IOError), exc:
                    if exc[0] != errno.EINTR:
                        raise
                #~ if urgent:print '>urgent:', urgent
            if self.timeouts:
                self.handle_timeouts()
            yield
            # this could had beed a ordinary function and have the run() call
            #this repeatedly but the _urgent_ operation this is usefull (as it
            #saves us needlessly hammering the active coroutines queue with
            #append and pop calls on the same thing
        self.cleanup()