package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func sayHello(){
defer wg.Done()
fmt.Println("Hello!")
}
func main() {
wg.Add(10)
for i:=0;i<10;i++{
go sayHello()
}
wg.Wait()
fmt.Println("主函数执行完成!")
}
goroutine的原理
线程由CPU调度是抢占式的,协程由用户态调度是协作式的
虽然一个goroutine的栈只占几KB,但实际是可伸缩的,如果需要更多内容,runtime会自动为goroutine分配
goroutine和OS线程是多对多的关系,即m:n
goroutine的GOMAXPROCS
GOMAXPROCS参数用来决定多少个OS线程来同时执行GO代码,默认是CPU的核心数,比如你的电脑是8核的,那么就会把你的Go程序调度到8个线程上去执行
但是,比如一些日志系统和监控系统,主要就是来监控程序的,如果直接将cup跑满的话,会大大降低程序的执行效率,所以通过设置GOMAXPROCS来设置
go程序会被几个线程给调度
func a() {
for i := 1; i < 10; i++ {
fmt.Println("A:", i)
}
}
func b() {
for i := 1; i < 10; i++ {
fmt.Println("B:", i)
}
}
func main() {
runtime.GOMAXPROCS(1)
go a()
go b()
time.Sleep(time.Second)
}
3.channel
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
//创建非缓冲通道
var cha = make(chan int)
func getNum(num int){
defer wg.Done()
cha <- num
}
func operationNum(){
defer wg.Done()
num := <- cha
num = num * 10
fmt.Println("拿到的值是:",num)
}
func main() {
wg.Add(2)
go getNum(10)
go operationNum()
wg.Wait()
fmt.Println("主函数执行完成!")
}
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var cha = make(chan int)
func getNum(num int)<-chan int{
defer wg.Done()
cha <- num
return cha
}
func operationNum(){
defer wg.Done()
num := <- cha
num = num * 10
fmt.Println("拿到的值是:",num)
}
func getChan(in chan<-int ){
defer wg.Done()
fmt.Println("接收到一个channel")
}
func main() {
wg.Add(2)
go getNum(10)
go operationNum()
var cha1 = make(chan<- int)
go getChan(cha1)
wg.Wait()
fmt.Println("主函数执行完成!")
}