'Invokes every callable in the observer list, passing in the args and
kwargs. Exceptions thrown by observers are logged but ignored. It is
not an error to fire a signal with no observers.
Returns a Deferred that will complete when all the observers have
completed.'

@defer.inlineCallbacks
def fire(self, *args, **kwargs):

    def do(observer):
        def eb(failure):
            logger.warning('%s    signal    observer    %s    failed:    %r', self.name, observer, failure, exc_info=(failure.type, failure.value, failure.getTracebackObject()))
            if (not self.suppress_failures):
                return failure
        return defer.maybeDeferred(observer, *args, **kwargs).addErrback(eb)
    with PreserveLoggingContext():
        deferreds = [do(observer) for observer in self.observers]
        res = (yield defer.gatherResults(deferreds, consumeErrors=True).addErrback(unwrapFirstError))
    defer.returnValue(res)
