通道
1.当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道
2.无缓冲通道和有缓冲通道,make的第二个参数就是缓冲区大小
3.无缓冲通道需要发送和接收都准备好,否则先执行的goroutine会阻塞等待
4.有缓冲的通道,在缓冲区没满之前,发送和接收动作都不会阻塞,空的时候接收才会阻塞

time.Now().Unix() 当前时间戳 time.Millisecond 毫秒
time.Sleep(1 * time.Second) 睡眠一秒

package main

import (
"fmt"
"math/rand"
"sync"
"time"
) const (
//全局常量
numberGoroutines = 4 //使用goroutine的数量
taskLoad = 10 //要处理的工作量
) var wg sync.WaitGroup //init函数会在main之前执行
func init() {
//初始化随机数
rand.Seed(time.Now().Unix())
}
func main() {
//创建有缓冲的通道管理,缓冲区是10
tasks := make(chan string, taskLoad) //启动4个goroutines来处理工作
wg.Add(numberGoroutines) //加入计数信号量
for i := 1; i <= numberGoroutines; i++ {
go worker(tasks, i)
} //主goroutine将10个字符串发送到通道,模拟分发给子goroutine的工作
for j := 1; j <= taskLoad; j++ {
tasks <- fmt.Sprintf("Task: %d", j)
}
//发送完成后,把通道关闭
close(tasks)
//如果一直往通道塞,子goroutine就可以一直工作,可以当队列用
// for {
// tasks <- fmt.Sprintf("Task: %d", rand.Int63n(10000000000))
// } //等待所有goroutines完成
wg.Wait()
} //处理工作
func worker(tasks chan string, worker int) {
defer wg.Done()
//无限循环处理接收到的工作,可以处理完一个以后继续处理下一个
for {
//从已经关闭的通道中,依然可以接收数据,并且返回一个通道类型的零值,如果一个都没接收到的时候会阻塞
//接收到一个以后,会继续往下执行
task, ok := <-tasks
//判断通道是否清空并关闭
if !ok {
fmt.Printf("Worker: %d:关闭\n", worker)
//直接退出这个goroutine
return
}
//正式开始工作
fmt.Printf("Worker: %d:开始工作\n", worker)
//用随机睡眠来模拟执行中
sleep := rand.Int63n(100)
time.Sleep(time.Duration(sleep) * time.Millisecond)
//显示完成了
fmt.Printf("Worker: %d :完成 %s \n", worker, task)
}
}

  

[Go] golang缓冲通道实现管理一组goroutine工作的更多相关文章

  1. [Go] golang缓冲通道实现资源池

    go的pool资源池:1.当有多个并发请求的时候,比如需要查询数据库2.先创建一个2个容量的数据库连接资源池3.当一个请求过来的时候,去资源池里请求连接资源,肯定是空的就创建一个连接,执行查询,结束后 ...

  2. golang中为何在同一个goroutine中使用无缓冲通道会导致死锁

    package main import "fmt" func main() { /* 以下程序会导致死锁 c := make(chan int) c <- 10 n1 := ...

  3. golang channel无缓冲通道会发生阻塞的验证

    公司搞了午间技术par,本周我讲的主题是关于无缓冲通道channel是否会发生阻塞,并进行了验证. go语言中channel分为无缓冲通道和有缓冲通道两种 channel提供了一种在goroutine ...

  4. [Go] golang无缓冲通道实现工作池控制并发

    展示如何使用无缓冲的通道创建一个goroutine池,控制并发频率1.无缓冲通道保证了两个goroutine之间的数据交换2.当所有的goroutine都忙的时候,能够及时通过通道告知调用者3.无缓冲 ...

  5. Golang并发编程有缓冲通道和无缓冲通道(channel)

    无缓冲通道 是指在接收前没有能力保存任何值得通道.这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作.如果两个goroutine没有同时准备好,通道会导 ...

  6. Go语言的通道(2)-缓冲通道

    有缓冲的通道相比于无缓冲通道,多了一个缓存的功能,如下图描述的一样: 从图上可以明显看到和无缓冲通道的区别,无缓冲必须两个Goroutine都进入通道才能进行数据的交换,这个不用,如果数据有,直接就能 ...

  7. Go语言的通道(1)-无缓冲通道

    前言: 上文中我们采用了[原子函数]已经[共享锁]两种方式分别对多个goroutine进行了同步,但是在go语言中提供了另一种更好的方式,那就是使用通道(Channel). 一.通道是什么? 其实无论 ...

  8. 美团Java团队分享:如何实践支付通道自动化管理

    随着支付业务量激增,支付团队不断壮大.为了满足日益增长的业务需求,大量的支付通道逐渐接入,但由于对接的各银行和第三方系统的稳定性参差不齐,支付通道故障时有发生,作为承接上下游的核心系统,要在一系列不稳 ...

  9. 6、LwIP协议规范翻译——缓冲及内存管理

    6.缓冲及内存管理 在一个通信系统中,内存缓冲管理系统必须容纳各种大小的缓冲数据,其范围从包含具有数百个字节的数据的全尺寸TCP段到只有几个字节的短ICMP回复包.此外,为了避免拷贝,应该让数据内容缓 ...

随机推荐

  1. 用Group by分组后,取每组的前3条记录,怎么取?

    使用子查询进行查询 SELECT * FROM home_content a WHERE ( SELECT count(id) FROM home_content WHERE class_link = ...

  2. Java后台使用Websocket教程

    在开发一个项目的时候使用到了WebSocket协议 什么是WebSocket? WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket A ...

  3. microk8s

    https://microk8s.io/ video guide: sudo snap install microk8s --classic #snap install microk8s --clas ...

  4. Mybatis Mapper文件中的一小坑

    前几天来一需求,实现过程中需要修改一个底层的查询接口,具体修改就是在where中添加一个条件,由于这个底层SQL使用的地方太多,所以就想着是用if加一标识符做个判断,传一个只有我会使用的参数,然后动态 ...

  5. swust oj 1012

    哈希表(链地址法处理冲突) 1000(ms) 10000(kb) 2542 / 6517 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法 ...

  6. Python的变量声明

    Python 与大多数其它语言一样有局部变量和全局变量之分,但是它没有明显的变量声明.变量通过首次赋值产生,当超出作用范围时自动消亡. Example 1. 定义 myParams 变量 if __n ...

  7. Go变量逃逸分析

    目录 什么是逃逸分析 为什么要逃逸分析 逃逸分析是怎么完成的 逃逸分析实例 总结 写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程 ...

  8. [Swift]LeetCode693. 交替位二进制数 | Binary Number with Alternating Bits

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...

  9. [Swift]LeetCode942. 增减字符串匹配 | DI String Match

    Given a string S that only contains "I" (increase) or "D" (decrease), let N = S. ...

  10. 动手实现一个 LRU cache

    前言 LRU 是 Least Recently Used 的简写,字面意思则是最近最少使用. 通常用于缓存的淘汰策略实现,由于缓存的内存非常宝贵,所以需要根据某种规则来剔除数据保证内存不被撑满. 如常 ...