美文网首页
go快速学习_go并发之goroutine

go快速学习_go并发之goroutine

作者: 卖毛玉的小贩 | 来源:发表于2019-07-17 23:27 被阅读0次
    本人不怎么喜欢写笔记博客啥的,所以通常是在学完一段时间后,才后知后觉的补充着写一点。
    那么话不多说,言归正传,为什么我会在茫茫后端中选择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

          本文链接:https://www.haomeiwen.com/subject/fjshlctx.html