<div>My point was to provide Paul a simple example of a situation he might be getting into that could cause the problems he is seeing - use of channnel preference which keeps the receiver from becoming active.<br></div>
<div>He doesn&#39;t send when channel.balance == 0, to keep the sending tasklet from blocking.  He only sends when there is something waiting to receive.  If his code uses the channel preference incorrect, that receiver is scheduled rather than immediately made active when the sending tasklet sends, and if the sending tasklet never reschedules itself, the receiver never gets time to run and receive again.</div>

<div> </div>
<div>- Chris<br></div>
<div class="gmail_quote">On Sat, Jul 11, 2009 at 11:57 AM, Andrew Francis <span dir="ltr">&lt;<a href="mailto:andrewfr_ice@yahoo.com" target="_blank">andrewfr_ice@yahoo.com</a>&gt;</span> wrote:<br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"><br>Hi Chris:<br>
<div>
<div></div>
<div><br>On Sat, Jul 11, 2009 at 6:53 PM, Chris Jacobson&lt;<a href="mailto:mainecoon@gmail.com" target="_blank">mainecoon@gmail.com</a>&gt; wrote:<br>&gt; I can think of at least one situation when this could occur, involving<br>
&gt; Channel Preference of 1 (Sender):<br>&gt;<br>&gt; Channel N is created with preference 1<br>&gt; Tasklet?A and?B start<br>&gt; Tasklet A runs, receives on N, and blocks<br>&gt; Tasklet?B sees N has balance -1, so sends to N.? Due to Preference, B will<br>
&gt; not yield, instead?A is placed at end of runnables queue.? The channel&#39;s<br>&gt; balance is now 0.<br>&gt; Tasklet?B continues running, sees N has a balance of 0, so does not send.<br>&gt; Repeat ad infinitum.? Tasklet?B never explicitly schedules or gets blocked<br>
&gt; otherwise, and so?A never wakes up.<br><br></div></div>Well one can create pathological cases. In regard to channels, pathological probably depends on inconsistently using the balance variable and the send()/receive() methods. In the example you stated, everything revolves around what &quot;sees N has a a balance of 0, so does not send.&quot; What does &quot;sees&quot; mean?<br>
<br>If b is in a loop and &quot;sees&quot; via a send(), then what happens is the second time, b blocks on a send() [which should have a balance of 0], the programme ends rather continues ad infiniuum. Why? All tasklets are now blocked.<br>
<br>Try it:<br><br>import stackless<br><br>def a(ch):<br>   message = ch.receive()<br>   print message<br><br><br>def b(ch):<br>   while(1):<br>      print ch.balance<br>      ch.send(&quot;foo&quot;)<br><br><br>if __name__ == &quot;__main__&quot;:<br>
  ch = stackless.channel()<br>  ch.preference = 1<br>  stackless.tasklet(a)(ch)<br>  stackless.tasklet(b)(ch)<br>  stackless.run()<br><br>In regards to Paul&#39;s problem. Posting code would be nice. However I have found that the more I use Stackless, the less I write code that looks at the channel.balance to make a scheduling decision.<br>
<br>Cheers,<br>Andrew<br><br><br><br><br><br><br><br>_______________________________________________<br>Stackless mailing list<br><a href="mailto:Stackless@stackless.com" target="_blank">Stackless@stackless.com</a><br><a href="http://www.stackless.com/mailman/listinfo/stackless" target="_blank">http://www.stackless.com/mailman/listinfo/stackless</a><br>
</blockquote></div><br>