Golang✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池

Posted 我是小白呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池相关的知识,希望对你有一定的参考价值。

【Golang】✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池

概述

Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 18 课)

通道关闭

通道关闭的意思是该通道不允许写入数据. 这个方法可以让通道数据的接收端和接收端知道数据已经全部发送完成了.

例子:

package main

import "fmt"

func main() {

	// 创建通道
	jobs := make(chan int, 5)  // 缓冲区为5
	done := make(chan bool)

	// 协程
	go func() {

		// 死循环
		for {
			j, ok := <-jobs
			if ok{
				fmt.Println("收到工作", j)
			} else {
				fmt.Println("收到全部工作结果")
				done <- true
			}
		}
	}()

	// 循环
	for i := 0; i < 3; i++ {
		jobs <-i
		fmt.Println("send job", i)
	}

	// 关闭通道
	close(jobs)
	fmt.Println("发送完毕")

	// 等待工作
	<-done

}

输出结果:

send job 0
send job 1
send job 2
发送完毕
收到工作 0
收到工作 1
收到工作 2
收到全部工作结果
收到全部工作结果

工作池


例子:

package main

import (
	"fmt"
	"time"
)

func worker(id int, jobs chan int, result chan int) {

	for job := range jobs{
		fmt.Println("worker", id, "开始干活", job)
		time.Sleep(time.Second)
		fmt.Println("worker", id, "结束干活", job)

		result <- job * 2
	}
}

func main() {

	// 创建通道
	jobs := make(chan int, 100)
	result := make(chan int, 100)

	// 开启三个协程
	for i := 1; i < 4; i++ {
		go worker(i, jobs, result)
	}

	for i := 1; i < 6; i++ {
		jobs <- i
	}

	// 关闭通道
	close(jobs)

	for i := 1; i < 6; i++ {
		<-result
	}

}

输出结果:

worker 3 开始干活 3
worker 2 开始干活 2
worker 1 开始干活 1
worker 2 结束干活 2
worker 2 开始干活 4
worker 3 结束干活 3
worker 3 开始干活 5
worker 1 结束干活 1
worker 3 结束干活 5
worker 2 结束干活 4

以上是关于Golang✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池的主要内容,如果未能解决你的问题,请参考以下文章

Golang✔️走进 Go 语言✔️ 第八课 函数

Golang✔️走进 Go 语言✔️ 第八课 函数

Golang✔️走进 Go 语言✔️ 第十四课 排序

Golang✔️走进 Go 语言✔️ 第十四课 排序

Golang✔️走进 Go 语言✔️ 第十一课 指针

Golang✔️走进 Go 语言✔️ 第十一课 指针