
Golang 线程之间的数据同步
一对一
package main
import (
. "fmt"
)
func main() {
foo := make(chan int)
// 启动写入线程
go func() {
for i := 0; i < 20; i ++ {
foo <- i
}
close(foo)
}()
//读取数据
for i := range foo {
Println(i)
}
}
一对多
package main
import (
. "fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
foo := make(chan int)
// 启动写入线程
go func() {
for i := 0; i < 20; i ++ {
foo <- i
}
close(foo)
}()
// 启动读取线程
for i := 0; i < 4; i ++ {
wg.Add(1)
go func() {
for i := range foo {
Println(i)
}
defer wg.Done()
}()
}
// 等待所有数据读取完成
wg.Wait()
}
多对一
package main
import (
. "fmt"
)
func main() {
// 写入函数的线程数
num := 4
// 缓存为 10
foo := make(chan int, 10)
bar := make(chan int)
// 监控是否全部写入
go func() {
for i := 0; i < num; i ++ {
<-bar
}
close(foo)
}()
// 启动写入线程
for i := 0; i < num; i ++ {
go func() {
for i := 0; i < 20; i ++ {
foo <- i
}
bar <- 1
}()
}
// 读取数据
for i := range foo {
Println(i)
}
}
多对多
package main
import (
. "fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
// 写入函数的线程数
inNum := 4
// 读取函数的线程数
outNum := 4
// 缓存为 10
foo := make(chan int, 10)
bar := make(chan int)
// 监控是否全部写入
go func() {
for i := 0; i < inNum; i ++ {
<-bar
}
close(foo)
}()
// 启动写入线程
for i := 0; i < inNum; i ++ {
go func() {
for i := 0; i < 20; i ++ {
foo <- i
}
bar <- 1
}()
}
// 读取数据
for i:= 0; i < outNum; i ++ {
wg.Add(1)
go func() {
for i := range foo {
Println(i)
}
defer wg.Done()
}()
}
// 等待所有数据读出
wg.Wait()
}