<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
On 3/15/10 7:03 PM, Carl, Andrew F (AS) wrote:
<blockquote
 cite="mid:CE1C9C26CC18FD4E804F232CEC1F845103B113FB@XMBTX132.northgrum.com"
 type="cite">
  <meta http-equiv="Content-Type"
 content="text/html; charset=ISO-8859-1">
  <meta name="Generator" content="Microsoft Word 12 (filtered medium)">
  <title>Just Not Getting One Aspect of Tasklets and Channel Receive on
Pong
Example</title>
  <style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
tt
        {mso-style-priority:99;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
  </style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
  <div class="Section1">
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);">Christian,<o:p></o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Thanks
for the reply and link to the stackless documentation. Seemed like
there should
be more than just the PDF. Regarding your reply, the part which is
unclear is
the implication of a tasklet which contains a channel receive. I
understand the
functionality and blocking, but it would seem that
&#8220;stackless.tasklet(&#8230;)()&#8221;
places an instance of a &#8220;callable&#8221; on the stackless queue. But once
the tasklet channel send is accomplished, that tasklet would be
complete and
exit out of the queue, no longer available to channel receive. It is
for this
reason that it appears that a new tasklet is being placed in the queue
as a
result of a channel send.</span><br>
  </p>
  </div>
</blockquote>
<br>
<pre>Why are you thinking that? The channel send is inside a function, and
when the send is done, the function continues. There is nothing
special here, and if it were, then it would surely be documented.

A tasklet is just a little housekeeping, wrapped around a piece
of code, and that is Python code that obeys the rules of Python.
And that piece of code can only be left by an explicit or
implicit return statement, or by an exception.
Tasklets are mostly like functions. When a tasklet goes asleep
on a channel, its current state is saved, so that it can
resume later on at exactly the same place where it left.

And a channel is just a little structure that holds a queue
of waiting tasklets, blocked either for sending or receiving.

The only unusual thing here is that the function resumes some
time later, when it gets unblocked from the channel. So the
only magic lies in the transfer of control during a channel
action. The time of 'what runs when' is what changes. The
rest is ordinary Python.

Ah, maybe I get the misunderstanding now. Yes, stackless.tasklet()
needs a callable, which gets called with another (), which creates
the instance of a callable, also called Python frame, and it is this
frame that the tasklet holds*). The frame itself is not callable,
this is only for the beginning of the tasklet's lifetime. After
that, it is just a resumable frame.
IOW. what Stackless essentially does is changing the order
of execution of these frames in a deterministic way.
I hope this paragraph did not add to confusion.

You can take my little walk-through literally for true,
this is exactly how it works, not more, not less.

Trust me, I initially wrote it, 10 years ago :-)

ciao -- chris
</pre>
<pre>
--------------------------
Please don't read this footnote before the above is sunken in!
*) well, in the case of tasklet( channel.send ) it is slightly
different, since channel.send is a builtin c function, and that
creates a different, but similar behaving, c-frame.
And that c-frame, bottom of our example, really ends after
being called, because there is nothing left after that call.
Forget about that detail, I just wanted to be correct.
</pre>
<pre class="moz-signature" cols="72">-- 
Christian Tismer             :^)   <a class="moz-txt-link-rfc2396E" href="mailto:tismer@stackless.com">&lt;mailto:tismer@stackless.com&gt;</a>
tismerysoft GmbH             :     Have a break! Take a ride on Python's
Johannes-Niemeyer-Weg 9A     :    *Starship* <a class="moz-txt-link-freetext" href="http://starship.python.net/">http://starship.python.net/</a>
14109 Berlin                 :     PGP key -&gt; <a class="moz-txt-link-freetext" href="http://wwwkeys.pgp.net/">http://wwwkeys.pgp.net/</a>
work +49 30 802 86 56  mobile +49 173 24 18 776  fax +49 30 80 90 57 05
PGP 0x57F3BF04       9064 F4E1 D754 C2FF 1619  305B C09C 5A3B 57F3 BF04
      whom do you want to sponsor today?   <a class="moz-txt-link-freetext" href="http://www.stackless.com/">http://www.stackless.com/</a></pre>
</body>
</html>