def deferToLater(self, when, func, *args, **kwargs): """deferToLater helper that tracks defers outstanding""" def cancel(d): d._cancelled = True d = Deferred(canceller=cancel) d._cancelled = False self.ps._callbacks.append(d) def f(): if d in self.ps._callbacks: self.ps._callbacks.remove(d) # Don't run if the deferred was cancelled already if d._cancelled: return try: result = func(*args, **kwargs) d.callback(result) except: d.errback(failure.Failure()) reactor.callLater(when, f) return d