go goroutine

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值