mirror of
https://github.com/golang/go
synced 2024-11-22 01:44:40 -07:00
update to new communications syntax
R=gri OCL=15417 CL=15417
This commit is contained in:
parent
27c0eb8431
commit
592d2e3d8d
@ -456,18 +456,17 @@ Here is the first function in "progs/sieve.go":
|
|||||||
--PROG progs/sieve.go /Send/ /^}/
|
--PROG progs/sieve.go /Send/ /^}/
|
||||||
|
|
||||||
The function "Generate" sends the sequence 2, 3, 4, 5, ... to its
|
The function "Generate" sends the sequence 2, 3, 4, 5, ... to its
|
||||||
argument channel, "ch", using the binary send operator "-<".
|
argument channel, "ch", using the binary communications operator "<-".
|
||||||
Channels block, so if there's no recipient for the the value on "ch",
|
Channels block, so if there's no recipient for the the value on "ch",
|
||||||
the send operation will wait until one becomes available.
|
the send operation will wait until one becomes available.
|
||||||
|
|
||||||
The "Filter" function has three arguments: an input channel, an output
|
The "Filter" function has three arguments: an input channel, an output
|
||||||
channel, and a prime number. It copies values from the input to the
|
channel, and a prime number. It copies values from the input to the
|
||||||
output, discarding anything divisible by the prime. The unary prefix
|
output, discarding anything divisible by the prime. The unary communications
|
||||||
operator "<-" (receive) retrieves the next value on the channel.
|
operator "<-" (receive) retrieves the next value on the channel.
|
||||||
|
|
||||||
--PROG progs/sieve.go /Copy/ /^}/
|
--PROG progs/sieve.go /Copy/ /^}/
|
||||||
|
|
||||||
|
|
||||||
The generator and filters execute concurrently. Go has
|
The generator and filters execute concurrently. Go has
|
||||||
its own model of process/threads/light-weight processes/coroutines,
|
its own model of process/threads/light-weight processes/coroutines,
|
||||||
so to avoid notational confusion we'll call concurrently executing
|
so to avoid notational confusion we'll call concurrently executing
|
||||||
@ -567,9 +566,7 @@ Inside "Server", a "select" statement chooses which of the multiple communicatio
|
|||||||
listed by its cases can proceed. If all are blocked, it waits until one can proceed; if
|
listed by its cases can proceed. If all are blocked, it waits until one can proceed; if
|
||||||
multiple can proceed, it chooses one at random. In this instance, the "select" allows
|
multiple can proceed, it chooses one at random. In this instance, the "select" allows
|
||||||
the server to honor requests until it receives a quit message, at which point it
|
the server to honor requests until it receives a quit message, at which point it
|
||||||
returns, terminating its execution. (The language doesn't yet allow the ":="
|
returns, terminating its execution.
|
||||||
syntax in "select" statements, although it might one day. Also, observe the use
|
|
||||||
of the binary, infix form of the receive operator.)
|
|
||||||
|
|
||||||
|
|
||||||
All that's left is to strobe the "quit" channel
|
All that's left is to strobe the "quit" channel
|
||||||
|
@ -13,7 +13,7 @@ type BinOp (a, b int) int;
|
|||||||
|
|
||||||
func Run(op *BinOp, request *Request) {
|
func Run(op *BinOp, request *Request) {
|
||||||
result := op(request.a, request.b);
|
result := op(request.a, request.b);
|
||||||
request.replyc -< result;
|
request.replyc <- result;
|
||||||
}
|
}
|
||||||
|
|
||||||
func Server(op *BinOp, service *chan *Request) {
|
func Server(op *BinOp, service *chan *Request) {
|
||||||
@ -38,7 +38,7 @@ func main() {
|
|||||||
req.a = i;
|
req.a = i;
|
||||||
req.b = i + N;
|
req.b = i + N;
|
||||||
req.replyc = new(chan int);
|
req.replyc = new(chan int);
|
||||||
adder -< req;
|
adder <- req;
|
||||||
}
|
}
|
||||||
for i := N-1; i >= 0; i-- { // doesn't matter what order
|
for i := N-1; i >= 0; i-- { // doesn't matter what order
|
||||||
if <-reqs[i].replyc != N + 2*i {
|
if <-reqs[i].replyc != N + 2*i {
|
||||||
|
@ -13,14 +13,13 @@ type BinOp (a, b int) int;
|
|||||||
|
|
||||||
func Run(op *BinOp, request *Request) {
|
func Run(op *BinOp, request *Request) {
|
||||||
result := op(request.a, request.b);
|
result := op(request.a, request.b);
|
||||||
request.replyc -< result;
|
request.replyc <- result;
|
||||||
}
|
}
|
||||||
|
|
||||||
func Server(op *BinOp, service *chan *Request, quit *chan bool) {
|
func Server(op *BinOp, service *chan *Request, quit *chan bool) {
|
||||||
for {
|
for {
|
||||||
var request *Request;
|
|
||||||
select {
|
select {
|
||||||
case request <- service:
|
case request := <-service:
|
||||||
go Run(op, request); // don't wait for it
|
go Run(op, request); // don't wait for it
|
||||||
case <-quit:
|
case <-quit:
|
||||||
return;
|
return;
|
||||||
@ -44,12 +43,12 @@ func main() {
|
|||||||
req.a = i;
|
req.a = i;
|
||||||
req.b = i + N;
|
req.b = i + N;
|
||||||
req.replyc = new(chan int);
|
req.replyc = new(chan int);
|
||||||
adder -< req;
|
adder <- req;
|
||||||
}
|
}
|
||||||
for i := N-1; i >= 0; i-- { // doesn't matter what order
|
for i := N-1; i >= 0; i-- { // doesn't matter what order
|
||||||
if <-reqs[i].replyc != N + 2*i {
|
if <-reqs[i].replyc != N + 2*i {
|
||||||
print("fail at ", i, "\n");
|
print("fail at ", i, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
quit -< true;
|
quit <- true;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ package main
|
|||||||
// Send the sequence 2, 3, 4, ... to channel 'ch'.
|
// Send the sequence 2, 3, 4, ... to channel 'ch'.
|
||||||
func Generate(ch *chan int) {
|
func Generate(ch *chan int) {
|
||||||
for i := 2; ; i++ {
|
for i := 2; ; i++ {
|
||||||
ch -< i // Send 'i' to channel 'ch'.
|
ch <- i // Send 'i' to channel 'ch'.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ func Filter(in *chan int, out *chan int, prime int) {
|
|||||||
for {
|
for {
|
||||||
i := <-in // Receive value of new variable 'i' from 'in'.
|
i := <-in // Receive value of new variable 'i' from 'in'.
|
||||||
if i % prime != 0 {
|
if i % prime != 0 {
|
||||||
out -< i // Send 'i' to channel 'out'.
|
out <- i // Send 'i' to channel 'out'.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ func Generate() *chan int {
|
|||||||
ch := new(chan int);
|
ch := new(chan int);
|
||||||
go func(ch *chan int){
|
go func(ch *chan int){
|
||||||
for i := 2; ; i++ {
|
for i := 2; ; i++ {
|
||||||
ch -< i
|
ch <- i
|
||||||
}
|
}
|
||||||
}(ch);
|
}(ch);
|
||||||
return ch;
|
return ch;
|
||||||
@ -21,7 +21,7 @@ func Filter(in *chan int, prime int) *chan int {
|
|||||||
go func(in *chan int, out *chan int, prime int) {
|
go func(in *chan int, out *chan int, prime int) {
|
||||||
for {
|
for {
|
||||||
if i := <-in; i % prime != 0 {
|
if i := <-in; i % prime != 0 {
|
||||||
out -< i
|
out <- i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}(in, out, prime);
|
}(in, out, prime);
|
||||||
@ -34,7 +34,7 @@ func Sieve() *chan int {
|
|||||||
ch := Generate();
|
ch := Generate();
|
||||||
for {
|
for {
|
||||||
prime := <-ch;
|
prime := <-ch;
|
||||||
out -< prime;
|
out <- prime;
|
||||||
ch = Filter(ch, prime);
|
ch = Filter(ch, prime);
|
||||||
}
|
}
|
||||||
}(out);
|
}(out);
|
||||||
|
Loading…
Reference in New Issue
Block a user