并发任务
var wg sync.WaitGroup
wg.Add(2)
go func() {
worker("hello")
wg.Done()
}()
go func() {
worker("world")
wg.Done()
}()
wg.Wait()
go fn 并发任务发在正常最前面
除了for range还支持
select {
case <- ch1:
// do something if read from ch1
case x := <-ch2:
// do something if read from ch2, and assign value to x
case ch3 <- y:
// do something if can write to ch3
default:
// do something if none of the above happens
}
//并发scile结构体
type Demo struct {
Name string
}
lists := []Demo{
{
"中国",
},
{
"美国",
},
}
wg := sync.WaitGroup{}
for _, v := range lists {
wg.Add(1)
//并发正确传值
go func(v Demo) {
defer wg.Done()
fmt.Println("name=", v.Name)
}(v)
}
wg.Wait()
安全map,并发用,普通的报错
wg := sync.WaitGroup{}
m := sync.Map{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
m.Store(i, i+1)
value, _ := m.Load(i)
fmt.Println(i, value)
wg.Done()
}(i)
}
wg.Wait()
//gf中并发安全
wg := sync.WaitGroup{}
m := gmap.New(true)
for i := 0; i < 100; i++ {
wg.Add(1)
go func(i int) {
m.Set(i, i+1)
value := m.Get(i)
fmt.Println(i, value)
wg.Done()
}(i)
}
wg.Wait()
//并发读取scile,不会丢失
wg := sync.WaitGroup{}
m := []int{1, 5, 7, 8, 56, 77, 777, 88, 85, 89}
ch := make(chan int, 1)
for v := range m {
wg.Add(1)
go func(v int) {
ch <- 1
fmt.Println(v, m[v])
<-ch
wg.Done()
}(v)
}
wg.Wait()
//并发scile写数据,不会丢失
wg := sync.WaitGroup{}
m := []int{}
ch := make(chan int, 1)
for i := 0; i < 100; i++ {
wg.Add(1)
go func(i int) {
ch <- 1
m = append(m, i)
<-ch
wg.Done()
}(i)
}
wg.Wait()
//gf中 并发scile写数据,不会丢失
wg := sync.WaitGroup{}
m := garray.NewIntArray(true)
for i := 0; i < 100; i++ {
wg.Add(1)
go func(i int) {
m.Append(i)
wg.Done()
}(i)
}
wg.Wait()
//切片并发读取
list := []int{1, 2, 3}
for _, v := range list {
go func(v int) {
fmt.Println(v)
}(v)
}
for {
}
文档更新时间: 2021-12-30 11:02 作者:Yoby