go快速学习_go并发之goroutine
2019-07-17 本文已影响0人
卖毛玉的小贩
本人不怎么喜欢写笔记博客啥的,所以通常是在学完一段时间后,才后知后觉的补充着写一点。
那么话不多说,言归正传,为什么我会在茫茫后端中选择go去学习呢?
大部分的原因就是因为,go足够轻量,对多线程的使用特别的舒服。
舒服的点也自然是go程,goroutine了。
说起这个,我们自然要讲一下,进程,线程,携程(我认为go程就是携程的一种)
进程
- 孤儿进程
- 父进程先于子进程终止,子进程沦落为孤儿进程,init进程负责回收
- 僵尸进程
- 子进程死亡,父进程尚未回收残留资源pcd时,子进程为僵尸进程
- 守护进程 daemon
- 永久不结束
- 通常不与前端进行数据交互
- 不占用控制终端 — 服务器
- 通常以d为结尾的单词
进程和线程
- 进程:
- 独立的地址空间,拥有pcb
- 最小分配资源的单位
- 线程:
- 有独立的pcb,但没有独立的地址空间,共享进程的地址空间
- 最小执行单位,cpu划分的时间片的最小依据
- 区别:
- 在于是否共享地址空间,独居-进程,合租-线程
- 当一个进程创建了新的线程后,该进程就沦落为线程。
线程同步
- 同步:协同步调,指定先后执行顺序。
- 线程同步:多个控制流,共同操作一个共享资源,需要执行访问先后顺序,实现同步。
- 同步方法:
- 系统提供的所有同步机制,都是建议锁,不具有强制性,锁加或不加,受程序控制
- 互斥锁 mutex
- 排他性,多个控制流之间互斥
- 持有后其他控制器无法进行任何操作
- 读写锁
- 读时共享,写时独占
- 写锁优先级高
- 读写锁只有一把,但具有两种属性(r/w)
- 互斥锁 mutex
协程
- 轻量级的线程
- 优点:
- 内存空间比线程的开销要小
- 省去了用户、内核空间切换的时间开销,执行效率提高
- 在线程阻塞期间,执行其他指令,充分在当前程序中,提高CPU的使用率
比较
- 进程:安全性,稳定性
- 线程:节省系统资源,开销小,效率高
- 协程:开销更小,cpu利用率更高,效率更高
goroutine
- 创建:在函数调用之前添加go,创建go程
- 特性:
- 主go先于子go结束运行,则自动释放进程空间
runtime.Goexit()
- return:关键字,返回当前函数调用到调用者那里去 defer有效
- runtim.Goexit()函数:终止调用该函数的go程
- ==主go程不能使用该函数==
- defer有效
- os.Exit:终止调用该函数的进程,defer无效
常见错误:
主函数里写go程后,运行发现无论如何也没有执行子go。
如果想要看go的异步特性,只需要在主main跑个死循环就可以。