help in understanding the stackless code

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

help in understanding the stackless code

ravi
hi,
I am new to python and need to know why the calling of switch(1) invokes the function "listen" twice in the below program?



import stackless

class EventHandler:
    def __init__(self,*outputs):
        if outputs==None:
            self.outputs=[]
        else:
            self.outputs=list(outputs)

        self.channel = stackless.channel()
        stackless.tasklet(self.listen)()

    def listen(self):
        print "in listen()..."
        while 1:
            val = self.channel.receive()
            self.processMessage(val)
            for output in self.outputs:
                self.notify(output)
               
    def processMessage(self,val):
        pass

    def notify(self,output):
        pass

    def registerOutput(self,output):
        print "in registerOutput()..."
        self.outputs.append(output)
   
    def __call__(self,val):
        print "in __call__ ..."
        self.channel.send(val)

class Switch(EventHandler):
    def __init__(self,initialState=0,*outputs):
        EventHandler.__init__(self,*outputs)
        self.state = initialState

    def processMessage(self,val):
        print "in processMessage() of Switch..."
        self.state = val

    def notify(self,output):
        print "in notify() of switch..."
        output((self,self.state))

class Reporter(EventHandler):
    def __init__(self,msg="%(sender)s send message %(value)s"):
        EventHandler.__init__(self)
        self.msg = msg
       
    def processMessage(self,msg):
        print "in processMessage() of Reporter..."
        sender,value=msg
        print self.msg % {'sender':sender,'value':value}


if __name__ == "__main__":
    reporter = Reporter()
    switch = Switch(0,reporter)
    switch(1)




output:
=========

in __call__ ...
in listen()...
in listen()...
in processMessage() of Switch...
in notify() of switch...
in __call__ ...
in processMessage() of Reporter...
<__main__.Switch instance at 0x8d822cc> send message 1





thanks.

Reply | Threaded
Open this post in threaded view
|

help in understanding the stackless code

MRAB-2
On 2015-06-18 08:41, ravi wrote:

> hi,
> I am new to python and need to know why the calling of switch(1) invokes the function "listen" twice in the below program?
>
>
>
> import stackless
>
> class EventHandler:
>      def __init__(self,*outputs):
>          if outputs==None:
>              self.outputs=[]
>          else:
>              self.outputs=list(outputs)
>
>          self.channel = stackless.channel()
>          stackless.tasklet(self.listen)()
>
>      def listen(self):
>          print "in listen()..."
>          while 1:
>              val = self.channel.receive()
>              self.processMessage(val)
>              for output in self.outputs:
>                  self.notify(output)
>
>      def processMessage(self,val):
>          pass
>
>      def notify(self,output):
>          pass
>
>      def registerOutput(self,output):
>          print "in registerOutput()..."
>          self.outputs.append(output)
>
>      def __call__(self,val):
>          print "in __call__ ..."
>          self.channel.send(val)
>
> class Switch(EventHandler):
>      def __init__(self,initialState=0,*outputs):
>          EventHandler.__init__(self,*outputs)
>          self.state = initialState
>
>      def processMessage(self,val):
>          print "in processMessage() of Switch..."
>          self.state = val
>
>      def notify(self,output):
>          print "in notify() of switch..."
>          output((self,self.state))
>
> class Reporter(EventHandler):
>      def __init__(self,msg="%(sender)s send message %(value)s"):
>          EventHandler.__init__(self)
>          self.msg = msg
>
>      def processMessage(self,msg):
>          print "in processMessage() of Reporter..."
>          sender,value=msg
>          print self.msg % {'sender':sender,'value':value}
>
>
> if __name__ == "__main__":
>      reporter = Reporter()
>      switch = Switch(0,reporter)
>      switch(1)
>
>
>
>
> output:
> =========
>
> in __call__ ...
> in listen()...
> in listen()...
> in processMessage() of Switch...
> in notify() of switch...
> in __call__ ...
> in processMessage() of Reporter...
> <__main__.Switch instance at 0x8d822cc> send message 1
>
Is it because EventHandler has 2 subclasses, namely Switch and
Reporter, and you have an instance of each?


Reply | Threaded
Open this post in threaded view
|

help in understanding the stackless code

ravi
In reply to this post by ravi
yes It has instance of both Reporter and Switch.
moreover I could not get why instance "reporter" is passed to class Switch
as a parameter ?

> >      reporter = Reporter()
> >      switch = Switch(0,reporter)
> >      switch(1)


thanks



On Thursday, June 18, 2015 at 5:45:08 PM UTC+5:30, MRAB wrote:

> On 2015-06-18 08:41, ravi wrote:
> > hi,
> > I am new to python and need to know why the calling of switch(1) invokes the function "listen" twice in the below program?
> >
> >
> >
> > import stackless
> >
> > class EventHandler:
> >      def __init__(self,*outputs):
> >          if outputs==None:
> >              self.outputs=[]
> >          else:
> >              self.outputs=list(outputs)
> >
> >          self.channel = stackless.channel()
> >          stackless.tasklet(self.listen)()
> >
> >      def listen(self):
> >          print "in listen()..."
> >          while 1:
> >              val = self.channel.receive()
> >              self.processMessage(val)
> >              for output in self.outputs:
> >                  self.notify(output)
> >
> >      def processMessage(self,val):
> >          pass
> >
> >      def notify(self,output):
> >          pass
> >
> >      def registerOutput(self,output):
> >          print "in registerOutput()..."
> >          self.outputs.append(output)
> >
> >      def __call__(self,val):
> >          print "in __call__ ..."
> >          self.channel.send(val)
> >
> > class Switch(EventHandler):
> >      def __init__(self,initialState=0,*outputs):
> >          EventHandler.__init__(self,*outputs)
> >          self.state = initialState
> >
> >      def processMessage(self,val):
> >          print "in processMessage() of Switch..."
> >          self.state = val
> >
> >      def notify(self,output):
> >          print "in notify() of switch..."
> >          output((self,self.state))
> >
> > class Reporter(EventHandler):
> >      def __init__(self,msg="%(sender)s send message %(value)s"):
> >          EventHandler.__init__(self)
> >          self.msg = msg
> >
> >      def processMessage(self,msg):
> >          print "in processMessage() of Reporter..."
> >          sender,value=msg
> >          print self.msg % {'sender':sender,'value':value}
> >
> >
> > if __name__ == "__main__":
> >      reporter = Reporter()
> >      switch = Switch(0,reporter)
> >      switch(1)
> >
> >
> >
> >
> > output:
> > =========
> >
> > in __call__ ...
> > in listen()...
> > in listen()...
> > in processMessage() of Switch...
> > in notify() of switch...
> > in __call__ ...
> > in processMessage() of Reporter...
> > <__main__.Switch instance at 0x8d822cc> send message 1
> >
> Is it because EventHandler has 2 subclasses, namely Switch and
> Reporter, and you have an instance of each?

Reply | Threaded
Open this post in threaded view
|

help in understanding the stackless code

Laura Creighton-2
In reply to this post by ravi
You need to send your message over here.
http://www.stackless.com/mailman/listinfo/stackless

I think I know the answer, from my work in duplicating stackless
for greenlets in pypy.  But that's the answer in theory.  In
practice, you need real stackless users.

Laura