from twisted.spread import pb class MasterDuckPond(pb.Cacheable): def __init__(self, ducks): self.observers = [] self.ducks = ducks def count(self): print("I have [%d] ducks" % len(self.ducks)) def addDuck(self, duck): self.ducks.append(duck) for o in self.observers: o.callRemote("addDuck", duck) def removeDuck(self, duck): self.ducks.remove(duck) for o in self.observers: o.callRemote("removeDuck", duck) def getStateToCacheAndObserveFor(self, perspective, observer): self.observers.append(observer) # you should ignore pb.Cacheable-specific state, like self.observers return self.ducks # in this case, just a list of ducks def stoppedObserving(self, perspective, observer): self.observers.remove(observer) class SlaveDuckPond(pb.RemoteCache): # This is a cache of a remote MasterDuckPond def count(self): return len(self.cacheducks) def getDucks(self): return self.cacheducks def setCopyableState(self, state): print(" cache - sitting, er, setting ducks") self.cacheducks = state def observe_addDuck(self, newDuck): print(" cache - addDuck") self.cacheducks.append(newDuck) def observe_removeDuck(self, deadDuck): print(" cache - removeDuck") self.cacheducks.remove(deadDuck) pb.setUnjellyableForClass(MasterDuckPond, SlaveDuckPond)