
Event Framework
cute()" member function, these will override any which may have been supplied when that instance of the Job class was created.
Real Time Events
The Python interface provides the ability to register interest in a number of real time events. These are program shutdown, one off alarms or actions, recurring actions, timers, signals and data activity on sockets. That an event of interest has occurred is notified by execution of a callback supplied at the time that interest in an event is registered.
In the C++ implementation, the methods for expressing interest in a specific type of event were spread across numerous classes. In the Python interface, all functions for registration of interest in events are contained within the Agent base class. Any object interested in receiving notification of an event oc- curring is expected to derive from the Agent class.
The simplest type of notification isn’t really a real time event at all, but a variation on the concept of scheduling a job with the dispatcher. Instead of calling the "schedule()" member function of the dispatcher, the "scheduleAction()" member function of the Agent base class is called.
The major difference between using "scheduleAction()" and "schedule()" is that when us- ing "scheduleAction()" you can optionally supply an additional string argument to be used as an identifier for that job. This identifier can be used to cancel the job before it actually gets executed by calling "cancelAction()". If the callback funcion accepts a single argument, the identifier will also be passed to the callback function as argument. The identifier can thus be used to distinguish be- tween different jobs calling the same callback function. If an identifier is not explicitly provided, a unique internal identifier will be created. Whether or not the identifier is set explicitly or created inter- nally, the identifier used is returned as the result of the "scheduleAction()" method.
class Object(netsvc.Agent): def __init__(self):
self.scheduleAction(self.callback1,netsvc.PRIORITY_JOB) def callback1(self):
self.scheduleAction(self.callback2,netsvc.IDLE_JOB,"hi") self.scheduleAction(self.callback2,netsvc.IDLE_JOB,"bye")
def callback2(self,name): print name
if name == "hi": self.cancelAction("bye")
dispatcher = netsvc.Dispatcher() object = Object() dispatcher.run()
When using the Agent class, you still need to run the dispatcher. You do not need to schedule any jobs directly with the dispactcher, but any initial agents need to be created prior to the dispatcher being run. Note that in scheduling a job with a particular identifier, any job already scheduled with that agent
28