GO语言:通道关闭与工作池

84 阅读1分钟
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
	}
}