go语言--通道
2020-12-13 15:15
标签:WaitGroup started 生产 hello 并行执行 并发 引用 处理流程 通知 多线程共享内存,以共享内存的方式来通信。比如java在访问共享数据的时候,通过加锁来实现,java.util.concurrent包。 CSP(communicating sequential processes)并发模型,以通信的方式来共享内存。Go的CSP并发模型是通过goroutine和channel来实现的。 原子函数和互斥函数都能工作,但是依靠它们都不会让编写并发程序变得更简单,更不容易出错,或者更有趣。在Go语言里,你可以使用通道来发送和接收需要共享的资源,在goroutine之间同步。 声明通道时,需要指定将要被共享的数据类型,可以以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。 无缓冲的通道:是指接收前没有能力保存任何值的通道,这种类型的通道要求发送goroutine和接收goroutine都准备好,才能完成发送和接受操作。如果没有同时准备好,回导致先执行发送或接收操作的goroutine阻塞等待。 有缓存的通道:是一种指在被接收前能储存一个或多个值的通道,这种类型的通道并不要求goroutine之间必须同时完成发送和接收。只有在通道中没有接收的值时,接收动作才会阻塞。只有在通道没有可用缓存区容纳被发送的值时,发送动作才会阻塞。 无缓存通道工作流程图: 有缓存通道工作流程图: 无缓存代码示例1: 无缓存通道代码示例2,实现阻塞生产者消费者模式: 有缓存通道代码示例1: 有缓存通道代码示例2,模拟多人工作: 借助?select?语句我们可以在一个协程中同时等待多个通道达到就绪状态。 select简单代码示例: 使用Select+超时实现无阻塞读写: go语言--通道 标签:WaitGroup started 生产 hello 并行执行 并发 引用 处理流程 通知 原文地址:https://www.cnblogs.com/wudiffs/p/11576699.html一、两种并发模型
二、通道
三、代码示例
package main
import "sync"
// wg1用来等待程序结束
var wg1 sync.WaitGroup
// 无缓冲的通道必须配对操作的goroutine出现,否则会一直阻塞
func main() {
// 计数加1,表示要等待一个goroutine
wg1.Add(1)
// 创建一个无缓冲的通道
c := make(chan string)
// 启动一个goroutine
go func() {
// 延时调用,在函数退出时调用done()来通知main函数工作已完成。
defer wg1.Done()
// 接收消息
value :=
package main
import (
"fmt"
"time"
)
// 生产者通过通道发送数据
func produce(p chan
package main
func main() {
// 创建带三个缓冲槽的通道
c := make(chan int, 3)
// 发送两个消息,缓冲槽区未满,不会阻塞
c
package main
import (
"sync"
"fmt"
"math/rand"
"time"
)
const (
// 要使用的goroutine的数量
numberGoroutines = 4
// 要处理的工作的数量
taskLoad = 10
)
// wg用来等待程序完成
var wg2 sync.WaitGroup
func main() {
// 创建一个有缓存的通道来管理工作
tasks := make(chan string, taskLoad)
wg2.Add(numberGoroutines)
// 启动goroutine来处理工作
for gr := 1; gr
四、通道结合select
1、select详解
select {
case
2、代码示例
package main
import (
"fmt"
"math/rand"
)
func main() {
// 定义三个chan int类型元素的通道数组
chs := [3]chan int{make(chan int, 1), make(chan int, 1), make(chan int, 1)}
// 随机生成0-2之间的数字
index := rand.Intn(3)
// 向通道发送随机数
chs[index]
package main
import (
"time"
"fmt"
)
// 使用Select+超时实现无阻塞读写
func main() {
c1 := make(chan string, 1)
c2 := make(chan string, 1)
go func() {
time.Sleep(time.Millisecond * 100)
c1