Hi,
I'm not so firm with the channel code, but I think it is fairly simple
to explain. Have a look at the documentation of the tasklet life cycle:
https://stackless.readthedocs.org/en/2.7-slp/library/stackless/tasklets.html#tasklet-life-cycle
As you can see, tasklet can become "current" without a running
scheduler. At the end of this section there is a simplified
documentation of the internal working of the stackless.run() function.
It does not enter a tasklet into the scheduler queue and it is not the
only way to switch tasklets.
Your example uses 2 tasklets:
1. the main tasklet
2. the tasklet "self.fun"
The line "stackless.tasklet(self.fun)()" creates and schedules tasklet
fun().
Then the main tasklet sends a message to through the channel self.ch.
This causes stackless to change the state of the main tasklet to
"blocked on channel" (See
https://stackless.readthedocs.org/en/2.7-slp/library/stackless/channels.html#channel.send
"If no other tasklet is already receiving on the channel, the sender
will be blocked."). At the same moment the next tasklet on the schedule
queue, that is tasklet "self.fun" becomes "current". It receives the
message from the channel self.ch. This changes the state of the main
tasklet from "blocked on channel" to "scheduled". Then tasklet self.fun
runs to the end of method self.fun and terminates. This again triggers
the scheduler and now the main tasklet becomes current again.
To observe the details, you may want to study the tracing example at
https://bitbucket.org/stackless-dev/stackless/src/9f2a496e6ba2cf9680e357451a8d75821d0ebb72/Stackless/demo/tracing.py?at=2.7-slp
Regards
Anselm
Am 22.06.2015 um 13:55 schrieb temp sha:
hi,
any help in understanding the program will be highly appreciated.
as per the stackless documentation stackless.run() is must
to start a scheduler. then how come the below program runs
the tasklet "fun" without stackless.run() call?
thanks in advance.
On Fri, Jun 19, 2015 at 2:36 AM, temp sha <[email protected]> wrote:
Hi,
I could not understand how the below program executes function "fun"
without calling stackless.run() in the program? Here "fun" runs as a
tasklet and as per my knowledge for that stackless.run() is must.
-----------------------------------------------------------------
import stackless
class A:
def __init__(self,name):
self.name = name
self.ch = stackless.channel()
stackless.tasklet(self.fun)()
def __call__(self,val):
self.ch.send(val)
def fun(self):
while 1:
v = self.ch.receive()
print "hi" , v
if __name__ == "__main__":
obj = A("sh")
obj(6)
-----------------------------------------------------------------
output:
----------
hi 6
thanks,
ravi
_______________________________________________
Stackless mailing list
[email protected]
http://www.stackless.com/mailman/listinfo/stackless
--
Dipl. Phys. Anselm Kruis science + computing ag
Senior Solution Architect Ingolstädter Str. 22
email [email protected] 80807 München, Germany
phone +49 89 356386 874 fax 737 www.science-computing.de
--
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Dr. Arno Steitz
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
_______________________________________________
Stackless mailing list
[email protected]
http://www.stackless.com/mailman/listinfo/stackless