Source generates jobs according to the interarrival time distribution

def generate(self):
        """
        Source generates jobs according to the interarrival time distribution
        """
        inter_arrival_time = 0.0
        while True:
            # wait for next job to arrive
            try:
                yield self._env.timeout(inter_arrival_time)

            except TypeError:
                # error: arrival time of wrong type
                error_msg = (
                    "arrival time '{}' has wrong type '{}'".format(
                        inter_arrival_time, type(inter_arrival_time).__name__
                    )
                )
                self._logger.error(error_msg)

                # trigger exception
                raise GGCQArrivalTimeTypeError(error_msg)

            except ValueError as exc:
                if str(exc).startswith('Negative delay'):
                    # error: negative arrival time
                    error_msg = (
                        "negative arrival time {:.2f}".format(
                            inter_arrival_time
                        )
                    )
                    self._logger.error(error_msg)

                    # trigger exception
                    raise GGCQNegativeArrivalTimeError(error_msg)
                else:
                    raise

            # job has arrived
            job_id = self._job_id
            self._observer.notify_arrival(time=self._env.now, job_id=job_id)

            # get job process
            job = self._job_generator(job_id)

            # submit job to queue
            self._env.process(job)

            # time for the next job to arrive
            try:
                inter_arrival_time = next(self._arrival_time_generator)
                self._job_id += 1
            except StopIteration:
                # no more jobs to arrive -- exit process
                self._env.exit()