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

举报
我是小白呀iamarookie 发表于 2021/09/09 23:16:22 2021/09/09
2.2k+ 0 0
【摘要】 【Golang】✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池 概述通道关闭工作池 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Gol...

【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

  
 

在这里插入图片描述

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/119724609

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。