Go语言中使用 goroutine 非常简单,只需要在函数或方法调用前加上go关键字就可以创建一个 goroutine ,从而让该函数或方法在新创建的 goroutine 中执行
创建一个新的 goroutine 运行函数f 或 匿名函数
go f()
或
go func(){
// ...
}()
package main
import "fmt"
func main() { //开启一个主的 Goroutine 执行 main
go hello() //开启一个主的 Goroutine 执行 hello
fmt.Println("hello lwl")
}
func hello() {
fmt.Println("hello")
}
结果:无序的
hello
hello lwl
或
hello lwl
hello
sync.WaitGroup
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup //step1 声明一个全局变量
func hello() {
fmt.Println("hello")
wg.Done() //step 5 登记 的 goroutine 清空 完成
}
func main() {
wg.Add(1) //step 2 登记1个goroutine
go hello() //step 3执行
fmt.Println("你好")
wg.Wait() //step 4 等待阻塞
}
例子1
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func hello(i int) {
fmt.Println(i)
wg.Done()
}
func main() {
wg.Add(100)
for i := 0; i < 100; i++ {
go hello(i)
}
wg.Wait()
}
例子2 闭包写法
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
wg.Add(100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
GOMAXPROCS
Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个 OS 线程来同时执行 Go 代码。默认值是机器上的 CPU 核心数。例如在一个 8 核心的机器上,GOMAXPROCS 默认为 8。Go语言中可以通过runtime.GOMAXPROCS函数设置当前程序并发时占用的 CPU逻辑核心数。(Go1.5版本之前,默认使用的是单核心执行。Go1.5 版本之后,默认使用全部的CPU 逻辑核心数。)
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func main() {
runtime.GOMAXPROCS(16) //使用 16个cpu处理协程
wg.Add(2)
go a()
go b()
wg.Wait()
}
func a() {
for i := 0; i < 50; i++ {
fmt.Println("a", i)
}
wg.Done()
}
func b() {
for i := 0; i < 50; i++ {
fmt.Println("b", i)
}
wg.Done()
}
结果:
处理一部分 b ,再处理一部分 a
b 0
b 1
b 2
b 3
b 4
b 5
b 6
b 7
b 8
b 9
b 10
b 11
b 12
b 13
b 14
b 15
b 16
b 17
b 18
b 19
b 20
b 21
b 22
b 23
b 24
b 25
b 26
b 27
b 28
b 29
b 30
b 31
b 32
b 33
b 34
b 35
b 36
b 37
a 0
a 1
a 2
a 3
a 4
a 5
a 6
a 7
a 8
a 9
a 10
a 11
a 12
a 13
a 14
a 15
a 16
a 17
a 18
a 19
a 20
a 21
b 38
b 39
b 40
b 41
b 42
b 43
b 44
b 45
a 22
a 23
a 24
a 25
a 26
a 27
a 28
a 29
a 30
a 31
a 32
a 33
a 34
a 35
a 36
b 46
b 47
b 48
b 49
a 37
a 38
a 39
a 40
a 41
a 42
a 43
a 44
a 45
a 46
a 47
a 48
a 49