Go开发笔记 二.Goroutine学习

先看看goroutine的使用,再讨论进程线程,粗浅讨论,欢迎评论补充和纠错
Goroutine和线程在使用上是非常相似的,下文的描述有时比较混淆,但是在讨论时是分开讨论的

Goroutine使用

Goroutine和其他语言的线程一样用在函数上,使用go关键字开始
调用函数

func printA(){
	fmt.Println("This is A")
}
func main(){
	go printA()  //使用goroutine
	printA() //一般调用
}

调用匿名函数

func main(){
	go func(){
		fmt.Println("This is A")
	}
}

创建Goroutine非常简单
当然除了主线程,其他Goroutine都会在主线程结束时立马结束生命

func main(){
	go func(){
		fmt.Println("This is A")
		time.Sleep(2*time.Secound)
		fmt.Println("A is a letter")
	}
	fmt.Println("This is B")
	time.Sleep(1*time.Secound)
	fmt.Println("B is a letter")
}

result:
This is A
This is B
B is a letter
This is A和This is B实际运行是顺序可能会改变
运行后发现在go func()开始后的代码没运行完,就结束了,因为主线程结束了。
Goroutine性能很强,可以轻松创建上万个,使用它配合chan更加有味道,才能完整;下一个写chan的使用心得

粗谈进程、线程、Goroutine

关于线程和进程可以看知乎大佬的讨论:https://www.zhihu.com/question/25532384
这里粗浅提炼下
进程是计算机资源的最小分配单位,为啥这么说呢,写过单片机的都知道,我们可以自己写个一直loop的代码跑在机器上。而只有操作系统才存在进程的概念,但是也有操作系统允许多种关系较小的功能“同时”跑,这里的每一种功能都有单独的入口,且互相之间相关性较小(如微信、浏览器、音乐播放器等)。一个进程可以在一个时间片内拥有计算机的所有资源,包括CPU、内存、键盘、鼠标、显示屏等,保证进程可以在独立空间内使用这些资源。所以进程之间的信息交换比线程困难,因为是相互独立的,当然你可以让他们建立联系,如用你的进程连接系统中的Mysql;在设计程序时可以用多进程,每个进程的功能最好高度聚合,进程间减少无用的信息交换,提高效率。
而线程是CPU计算资源的分配单位,线程更像是进程的一个成员,把进程比作一个组,就叫音乐组。音乐组中的线程共享进程的办公资源,当只有一个仅容纳一人(单核CPU)的桌子时每个人要排队用,而且有一定的优先级;但是当拥有多套桌子(多核CPU),可以同时办公;每个线程可以负责不同的工作如负责唱歌、弹奏、写词、打杂等等,也可以是多个歌手一起唱,看你如何设计。
而Goroutine其实和线程思想是一致的都是为了提高资源利用效率,但是不同于大多数的线程设计,Goroutine比线程轻,大部分线程的堆栈大小是固定的(一般为2M)但是Goroutine根据程序动态调整大小,不浪费也提高线程的性能;在其他方面也减少线程使用的代价,提升性能。
可以说Goroutine是我用得最爽的“线程”,在Go中使用Goroutine比其他语言使用线程更加简单也更灵活,现在想想Java和Python的线程使用起来还是稍微复杂。而Goroutine配合chan(通道)能简单的完成很多功能,chan这个特性学完之后也很佩服Go的设计者,将
“线程”间的同步以及信息交流变得简单和魔幻。

你可能感兴趣的:(Golang,golang,学习,开发语言)