docs: fix channel select example (#10213)

pull/10218/head
Khaled Hammouda 2021-05-27 05:47:13 -04:00 committed by GitHub
parent 539594bfce
commit 25645dbc44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 22 deletions

View File

@ -2885,29 +2885,48 @@ y := <-ch2 ?
The `select` command allows monitoring several channels at the same time The `select` command allows monitoring several channels at the same time
without noticeable CPU load. It consists of a list of possible transfers and associated branches without noticeable CPU load. It consists of a list of possible transfers and associated branches
of statements - similar to the [match](#match) command: of statements - similar to the [match](#match) command:
```v wip ```v
import time import time
fn main() { fn main() {
c := chan f64{}
ch := chan f64{} ch := chan f64{}
ch2 := chan f64{} ch2 := chan f64{}
ch3 := chan f64{} ch3 := chan f64{}
mut b := 0.0 mut b := 0.0
// ... c := 1.0
// ... setup go threads that will send on ch/ch2
go fn (the_channel chan f64) {
time.sleep(5 * time.millisecond)
the_channel <- 1.0
}(ch)
go fn (the_channel chan f64) {
time.sleep(1 * time.millisecond)
the_channel <- 1.0
}(ch2)
go fn (the_channel chan f64) {
_ := <-the_channel
}(ch3)
//
select { select {
a := <-ch { a := <-ch {
// do something with `a` // do something with `a`
eprintln('> a: $a')
} }
b = <-ch2 { b = <-ch2 {
// do something with predeclared variable `b` // do something with predeclared variable `b`
eprintln('> b: $b')
} }
ch3 <- c { ch3 <- c {
// do something if `c` was sent // do something if `c` was sent
time.sleep(5 * time.millisecond)
eprintln('> c: $c was send on channel ch3')
} }
> 500 * time.millisecond { > 500 * time.millisecond {
// do something if no channel has become ready within 0.5s // do something if no channel has become ready within 0.5s
eprintln('> more than 0.5s passed without a channel being ready')
} }
} }
eprintln('> done')
} }
``` ```