栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

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

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

学习笔记,写到哪是哪。

关于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=%dn", 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会将计数器减一,一旦没了,就等待结束。

小结

还有不少内容,细细看。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902433.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号