import Pyro.core import Pyro.util import Pyro.naming from RemoteObject import * # A Subject is an object that keeps track of the Observers # watching it. When the state of a subject changes, it # notifies each Observer on the list. class Subject(RemoteObject): def __init__(self, name): RemoteObject.__init__(self, name) self.observers = [] def register(self, uri): # register a new Observer observer = Pyro.core.getProxyForURI(uri) self.observers.append(observer) def notify_observers(self): # notify all registered observers when the state of the subject changes for observer in self.observers: print 'Notifying', observer try: observer.notify() except: pass class SimpleSubject(Subject): def __init__(self, name, state=0): Subject.__init__(self, name) self.state = 0 def set_state(self, state): # change the state of the Subject print 'New state', state self.state = state Thread(target=self.notify_observers).start() def get_state(self): # get the current state of the Subject return self.state def main(script, name='bob', *args): SimpleSubject(name).requestLoop() if __name__ == '__main__': main(*sys.argv)