golang学习笔记(十一)

        go语言中的可以通过go关键字方便的开启协程,协程相当于轻量级的线程。

        一个程序启动便开启一个进程,一个进程至少有一个线程,也就是主线程。线程是CPU调度的基本单位,也就是说线程的挂起和运行是由内核统一调度的。

        而协程则是在用户态的协程调度器调度,协程的调度不涉及用户态内核态的切换,所以协程间切换的开销要远远小于线程间切换的开销。

        线程被创建时就会分配一个线程id和一些资源,比如固定大小的栈空间(默认大小是1M),线程间共享进程的堆空间。为什么每个线程有自己的栈空间呢?

        因为函数间调用时,函数内部的变量就在栈上,多个线程同时调用同一个函数时,如果每个线程没有自己独立的栈空间,会导致函数调用数据的错乱。因为线程间共享全局数据和堆上的数据,所以线程使用时要加锁,保证独享资源。

        之所以说协程比线程更轻量级,是因为以动态扩展的方式使用空间,创建之初比线程更小,初始只有2k大小,而线程是1M。

        线程的创建需要系统资源,释放时要回收系统资源。协程的创建和销毁比起线程来说代价也就小的多。所以使用协程我们可以比线程更小的代价并行的执行多个函数或者方法,所以协程使用更灵活。

        例:

        

package main

import (
	"fmt"
	"sync"
)

var wg = sync.WaitGroup{}

func main() {
	wg.Add(5) //表示要等待5个协程结束,数值为 执行一次 	wg.Done 相当于wg.Add(-1), 减到0 wg.Wait()停止等待
	//开启5个协程 5个协程并发执行
	for i := 0; i < 5; i++ {
		go gorun(i)
	}
	wg.Wait()
}

func gorun(i int) {
	fmt.Println("hello go ", i)
	wg.Done()
}

goroutine 使用起来很简单方便,这个相比于C++而言要简便太多。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值