[Stackless] channel.balance wrong?!

Andrew Francis andrewfr_ice at yahoo.com
Sat Jul 11 20:57:59 CEST 2009


Hi Chris:

On Sat, Jul 11, 2009 at 6:53 PM, Chris Jacobson<mainecoon at gmail.com> wrote:
> I can think of at least one situation when this could occur, involving
> Channel Preference of 1 (Sender):
>
> Channel N is created with preference 1
> Tasklet?A and?B start
> Tasklet A runs, receives on N, and blocks
> Tasklet?B sees N has balance -1, so sends to N.? Due to Preference, B will
> not yield, instead?A is placed at end of runnables queue.? The channel's
> balance is now 0.
> Tasklet?B continues running, sees N has a balance of 0, so does not send.
> Repeat ad infinitum.? Tasklet?B never explicitly schedules or gets blocked
> otherwise, and so?A never wakes up.

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 "sees N has a a balance of 0, so does not send." What does "sees" mean?

If b is in a loop and "sees" 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.

Try it:

import stackless

def a(ch):
    message = ch.receive()
    print message


def b(ch):
    while(1):
       print ch.balance
       ch.send("foo")


if __name__ == "__main__":
   ch = stackless.channel()
   ch.preference = 1
   stackless.tasklet(a)(ch)
   stackless.tasklet(b)(ch)
   stackless.run()

In regards to Paul'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.

Cheers,
Andrew





      




More information about the Stackless mailing list