Go语言使用go
关键词实现goroutine并发,可以通过channel
传输数据。
go关键词修饰函数实现goroutine并发:
func main_go() {
// runtime.GOMAXPROCS(最大256)
fmt.Println(runtime.NumCPU()) // 16
runtime.GOMAXPROCS(8) // 8核16线程,默认就是runtime.NumCPU()
var w sync.WaitGroup // 跟java的countdown差不多
w.Add(10)
for i := 0; i < 10; i++ {
// w.Add(1)
// 使用go,相当于new Thread().start() . 栈:2K
go func(i int) {
defer w.Done()
fmt.Printf("goooooo:::%d\n", i)
}(i)
}
fmt.Println("demo2")
w.Wait()
// time.Sleep(time.Second)
// `GMP` m:n 把m个G交给n个操作系统线程执行
}
channel变量实现数据交换:
func main_channel() {
// channel FIFO
// var a []int
// var b chan int
var w sync.WaitGroup
w.Add(1)
var c = make(chan int /*, 1*/) // 初始化通道,通道必须初始化才能使用
go func() {
x := <-c
// <- c // 可以直接忽略
fmt.Printf("x=%d\n", x)
w.Done()
}()
c <- 10
fmt.Println(c)
// 关闭通道
close(c)
w.Wait()
// <- 不管是发送还是接受,都使用这个符号
// 发送:c <- 1
// 接受:x := <- c
// 关闭close()
// 单向通道
var get_channel <-chan int // 只能取
var put_channel chan<- int // 只能存
get_channel = make(<-chan int)
put_channel = make(chan<- int)
fmt.Println(get_channel, put_channel)
}