golang 中sync.WaitGroup以及select简单实用
su_sai · · 3181 次点击 · · 开始浏览golang中sync.WaitGroup的作用类似于channel,可实现并发。
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) //多核
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go f(&wg, i)
}
wg.Wait()
}
func f(w *sync.WaitGroup, i int) {
fmt.Println(i, "go")
w.Done()
}
golang中select是配合channel使用的。
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
c1, c2 := make(chan int), make(chan string)
flag := make(chan bool, 2)
go func() {
for {
select {
case k, err := <-c1:
if !err {
flag <- true
break
}
fmt.Println(k)
case k, err := <-c2:
if !err {
flag <- true
break
}
fmt.Println(k)
}
}
}()
c1 <- 1
c2 <- "a"
c1 <- 2
c2 <- "b"
close(c1)
close(c2)
for i := 0; i < 2; i++ {
<-flag
}
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
golang中sync.WaitGroup的作用类似于channel,可实现并发。
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) //多核
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go f(&wg, i)
}
wg.Wait()
}
func f(w *sync.WaitGroup, i int) {
fmt.Println(i, "go")
w.Done()
}
golang中select是配合channel使用的。
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
c1, c2 := make(chan int), make(chan string)
flag := make(chan bool, 2)
go func() {
for {
select {
case k, err := <-c1:
if !err {
flag <- true
break
}
fmt.Println(k)
case k, err := <-c2:
if !err {
flag <- true
break
}
fmt.Println(k)
}
}
}()
c1 <- 1
c2 <- "a"
c1 <- 2
c2 <- "b"
close(c1)
close(c2)
for i := 0; i < 2; i++ {
<-flag
}
}