golang channel 12
1.启动设置运行线程数
func main() {
//环境变量位置
root := runtime.GOROOT()
//当前操作系统
system := runtime.GOOS
fmt.Println(root ,system)
//获取服务器线程数
num := runtime.NumCPU()
//设置运行线程数
runtime.GOMAXPROCS(num -1)
fmt.Println("cpu",num -1)
}
2.go
/*
go test("并发") 理解为开的一个协程,主线程执行完毕时,协程也会跟着停止
*/
func main() {
go test("并发") //不会输出(主线程执行完毕时,协程也会跟着停止)
test("普通") //执行在前面
//time.Sleep(1)
}
func test(a string){
fmt.Println("我是:",a)
}
3.WaitGroup 预备跑
/*
等待所有协程完成会执行,预备跑
*/
func group(){
var wg sync.WaitGroup
wg.Add(5)
fmt.Println("预备")
for i := 0; i < 5; i = i + 1 {
//wg.Add(1)
go func(n int) {
defer wg.Done() //等价于 defer wg.Add(-1)
time.Sleep(2)
fmt.Println(n)
}(i)
}
wg.Wait()
fmt.Println("跑")
}
4.chan
1.全局变量和锁同步
2.Channel(先进先出、线程安全、 channel是有类型的)
声明
var 变量名 chan 类型
var test chan int
var test chan string
var test chan map[string]string
var test chan stu
var test chan *stu
初始化
var test1 = chan int
test1 = make(chan int) //只能存一个参数
test2 = make(chan int, 10) //可以存10个参数
func main() {
//chan简单使用
intChan := make(chan int, 10)
go write(intChan)
go read(intChan)
time.Sleep(time.Second * 5)
}
func write(ch chan int) {
for i := 0; i < 100; i++ {
ch <- i
fmt.Println("put data: ", i)
}
}
func read(ch chan int) {
for {
var b int
b = <-ch
fmt.Println(b)
time.Sleep(time.Second)
}
}
5.select
/*
select
一个循环监听多个channel
*/
func selectR() {
var ch chan int
ch = make(chan int, 10)
ch2 := make(chan int, 10)
go func() {
var i int
for {
ch <- i
time.Sleep(time.Second)
ch2 <- i * i
time.Sleep(time.Second)
i++
}
}()
for {
select {
case v := <-ch:
fmt.Println(v)
case v := <-ch2:
fmt.Println(v)
case <-time.After(time.Second): //定时器,1秒钟后执行
fmt.Println("get data timeout")
time.Sleep(time.Second)
}
}
}
还没有评论,来说两句吧...