On Thu, Nov 12, 2009 at 4:38 PM, P.H.Welch <P.H.Welch@xxxxxxxxxx> wrote:
>
> Hi Carl,
>
>> Sequential delta? yes
>
> How elegant does a parallel delta look in go? I've still not looked
> at go enough. It has a FORK, but does it have a PAR (i.e. FORK-JOIN)?
You have to manually do a FORK-JOIN, which is part of the problem that
I'm having with it. The only way to "wait" on a process finishing is
to give that process a channel and then wait on it. There's no
poisoning or anything like it, just the ability to close channels,
which works like this.
a = make(chan int);
close(a);
if closed(a) {
// This won't happen, because the channel hasn't been read from yet
}
foo := <-a;
// This read from a closed channel, which returns the zero value for the
// type, so foo is 0.
if closed(a) {
// This finally happens
}
All of this together with a lack of currying and some other nice
features, means that writing a PAR construct that ensures all of its
components terminate before proceeding is a bit difficult. The
problem is thus:
* Each process in the PAR needs to be given a channel that they can
use to signal they are finished with their computation
* There is no way to do vararg functions that I've found, so having
a "dispatch" wrapper that does just this is not easy to write.
I came up with the attached code that lets me get CLOSE to having a
nice syntax.. but it's too complex by far. It's 80 lines, or I would
have included it inline =).
--
Jim Whitehead
Oxford University Computing Lab
Attachment:
process.go
Description: Binary data