On Wed, Nov 30, 2016 at 6:07 PM <omarshariffdontlik...@gmail.com> wrote:

> Hi, I'm having a bit of a slow day... I'm trying to synchronise two reads
> from two channels and can't get my fuzzy head round the problem.
Go doesn't have support for an (atomic) read from multiple channels at
once. There are other systems which can do this (JoCaml, join-calculus,
Concurrent ML, Haskell's STM, Reagents[0] in Scala, ...)

However, as you found out, one can often rearrange the code base as to
avoid the problem. There is also the problem of more advanced
select-constructs not being free in the performance sense: atomic sync on
multiple channels tend to be rather expensive.

One reason it isn't that simple to implement is to consider the following
(hypothetical) snippet:

select {
    case w := <-available && urlChan <- value:

in which the atomic operation must simultaneously receive a message on the
'available' channel and send a message on the 'urlChan' channel. And
further, since you introduced && to mean logical-and-between-channels, you
might as well introduce || to mean logical-or-between-channels. Once there,
you may want to introduce a new type

event t

for some type t alongside 'chan t'. Hence the expression (<-available)
becomes an expression of type 'event *worker' and now they can be composed
via && and ||. This means we can get rid of select since it is just an
expression which successively applies || to a slice of values. If we then
introduce an new statement, sync, which turns 'event t' into a 't', we are
done. And we have almost implemented the basis of Concurrent ML in the

In short, you could be opening a regular can of worms if you start allowing
for more complicated select-expressions. Hence the school of keeping them
relatively simple.

[0] https://people.mpi-sws.org/~turon/reagents.pdf

You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to