go快速学习_go并发之goroutine

本人不怎么喜欢写笔记博客啥的,所以通常是在学完一段时间后,才后知后觉的补充着写一点。
那么话不多说,言归正传,为什么我会在茫茫后端中选择go去学习呢?

大部分的原因就是因为,go足够轻量,对多线程的使用特别的舒服。
舒服的点也自然是go程,goroutine了。
说起这个,我们自然要讲一下,进程,线程,携程(我认为go程就是携程的一种)

进程

  1. 孤儿进程
    • 父进程先于子进程终止,子进程沦落为孤儿进程,init进程负责回收
  2. 僵尸进程
    • 子进程死亡,父进程尚未回收残留资源pcd时,子进程为僵尸进程
  3. 守护进程 daemon
    • 永久不结束
    • 通常不与前端进行数据交互
    • 不占用控制终端 — 服务器
    • 通常以d为结尾的单词

进程和线程

  • 进程:
    • 独立的地址空间,拥有pcb
    • 最小分配资源的单位
  • 线程:
    • 有独立的pcb,但没有独立的地址空间,共享进程的地址空间
    • 最小执行单位,cpu划分的时间片的最小依据
  • 区别:
    • 在于是否共享地址空间,独居-进程,合租-线程
  • 当一个进程创建了新的线程后,该进程就沦落为线程。

线程同步

  • 同步:协同步调,指定先后执行顺序。
  • 线程同步:多个控制流,共同操作一个共享资源,需要执行访问先后顺序,实现同步。
  • 同步方法:
  • 系统提供的所有同步机制,都是建议锁,不具有强制性,锁加或不加,受程序控制
    • 互斥锁 mutex
      • 排他性,多个控制流之间互斥
      • 持有后其他控制器无法进行任何操作
    • 读写锁
      • 读时共享,写时独占
      • 写锁优先级高
      • 读写锁只有一把,但具有两种属性(r/w)

协程

  • 轻量级的线程
  • 优点:
    • 内存空间比线程的开销要小
    • 省去了用户、内核空间切换的时间开销,执行效率提高
    • 在线程阻塞期间,执行其他指令,充分在当前程序中,提高CPU的使用率

比较

  • 进程:安全性,稳定性
  • 线程:节省系统资源,开销小,效率高
  • 协程:开销更小,cpu利用率更高,效率更高

goroutine

  • 创建:在函数调用之前添加go,创建go程
  • 特性:
    • 主go先于子go结束运行,则自动释放进程空间

runtime.Goexit()

  • return:关键字,返回当前函数调用到调用者那里去 defer有效
  • runtim.Goexit()函数:终止调用该函数的go程
    • ==主go程不能使用该函数==
    • defer有效
  • os.Exit:终止调用该函数的进程,defer无效

常见错误:
主函数里写go程后,运行发现无论如何也没有执行子go。
如果想要看go的异步特性,只需要在主main跑个死循环就可以。

你可能感兴趣的:(go快速学习_go并发之goroutine)