[Stackless] More CSP

Tom Locke tom at livelogix.com
Wed Jan 7 13:21:08 CET 2004


[NOTE: My email was dead for most of today - this is already out of
date.
       Python implementation of alt *seems* to be working - will follow]

Hi All,

Having started to dig around, I'm coming to the conclusion that I may
start with an all-python solution that uses the existing channel support
and various scheduling hooks.

For example, par is very easy:

(For the uninitiated, A par construct runs a bunch of processes in
parallel, the par process itself terminates when all of the
sub-processes have terminated).

--------------------------
def par(*funcs):
    taskEnd = channel()
    
    def signalEnd(f):
        f()
        taskEnd.send(1)

    for f in funcs:
        tasklet(signalEnd)(f).run()

    count = len(funcs)
    while count > 0:
        taskEnd.receive()
        count -= 1

#Example usage:

def counter(c, out):
    for x in range(1, c+1):
        out.send(x)
    out.send('end')


def accumulate(inp):
    acc = 0
    while 1:
        x = inp.receive()
        if x == 'end': break
        acc += x
    print acc

def test():
    c = channel()
    par(
        lambda: counter(6, c),
        lambda: accumulate(c)
        )
-----------------------

Comments:

I'm assuming it's ok to send on a channel from multiple tasklets?? In
occam this is a 'shared' channel, in JCSP an 'any-to-one' channel.

The use of a channel to signal tasklet-end is perhaps a bit heavy? Are
chan.send() and chan.receive() the only ways to make the *current*
tasklet block?

Implementing alt entirely in python would probably get much more messy.
In particular, it might require a new altChannel class, that looks like
a channel (i.e. send/receive methods) but actually encapsulates more
than one 'real' channel, or multiple underlying sends/receives per
communication. This might be interesting as a proof of concept, but is
not a long term solution.

Tom.



_______________________________________________
Stackless mailing list
Stackless at stackless.com
http://www.stackless.com/mailman/listinfo/stackless



More information about the Stackless mailing list