package main
import (
"fmt"
)
func main() {
jobs := make(chan int, 5)
done := make(chan bool)
go func() {
for {
job, more := <-jobs//返回两个变量,第一个是消息内容,第二个记录是否发出有效消息(可以不接受第二个参数)job := <-jobs
if more {
fmt.Println("get job:", job)
}else {
done <- true
fmt.Println("get all jobs")
}
}
}()
for i := 1; i <= 3; i++ {
jobs <- i
fmt.Println("sent job:", i)
}
close(jobs)//关闭jobs通道避免死锁
//关闭通道表示:该通道不会在接收消息,所以读取完剩余消息后无需在等待它接收消息
fmt.Println("done")
<-done //锁住,直到done能成功发出消息
//当一个通道没有消息而要往外发送消息时,就会等待,直到能成功发出有效消息
}
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <- chan int, result chan <- int){
for j := range jobs {
fmt.Println("worker:", id, "start job:", j)
time.Sleep(time.Second)
fmt.Println("worker:", id, "end job:", j)
result <- j
}
}
func main() {
jobs := make(chan int, 100)
result := make(chan int, 100)
for i := 1; i <= 3; i++ {
go worker(i, jobs, result)
}
for i := 1; i <= 5; i++ {
jobs <- i
}
close(jobs)
for i := 1; i <= 5; i++ {
<-result
}
}