Go语学习笔记 - goroutine | 从零开始Go语言

Go语学习笔记 - goroutine | 从零开始Go语言,第1张

学习笔记,写到哪是哪。

关于golang的协程早有耳闻,具体概念不过多赘述了,可以理解为轻量级的线程,一个线程中可以存在多个协程。协程在同一个线程中,只有一个协程在运行。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接 *** 作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

1、go关键字使用

看看协程的使用。

样例代码如下:

package main

import (
	"fmt"
	"time"
)

func printName() {
	for i := 0; i < 100; i++ {
		fmt.Println(i)
		time.Sleep(1 * time.Second)
	}
}

func printName1(a int) {
	for i := 0; i < 2; i++ {
		fmt.Printf("a=%d\n", a+i)
		time.Sleep(1 * time.Second)
	}
}

func main() {
	go printName()
	printName1(100)
}

直接结果

a=100
0
1
a=101

可以看出,go函数在异步执行。

2、协程等待

golang的协程等到方式,sync.WaitGroup的使用类似于Java的CountDownLatch类的使用。

样例代码如下

package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	wg sync.WaitGroup
)

func wait_go() {
	defer wg.Done()
	_i := 0
	for _i <= 2 {
		fmt.Println("haha")
		time.Sleep(1 * time.Second)
		_i++
	}
}

func wait_go1() {
	defer wg.Done()
	_i := 0
	for _i <= 3 {
		fmt.Println("ohoh")
		time.Sleep(1 * time.Second)
		_i++
	}
}

func main() {
	fmt.Println("start")
	wg.Add(2)
	go wait_go()
	go wait_go1()
	wg.Wait()
}

执行结果

start
ohoh
haha
haha
ohoh
ohoh
haha
ohoh

可以看出,主函数并没有直接结束,而是在wg.Wait()等待协程函数执行结束。wg.Add类似计数器,有几个需要等到的函数就添加多大的数字,函数在执行结束的时候wg.Done会将计数器减一,一旦没了,就等待结束。

小结

还有不少内容,细细看。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/989554.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存