什么是主 goroutine?

它与我们自己启用的其他goroutine 有什么不同?

本文就来为你一一解答!

以下内容节选自**《Go语言极简一本通:零基础入门到项目实战》**一书!

并发

串行程序,即程序的执行顺序和程序的编写顺序一致,整个程序只有一个上下文,就是一个栈,一个堆。

并发程序,则需要运行多个上下文,对应多个调用栈。每个进程在运行时,都有自己的调用栈和堆,有一套完整的上下文。操作系统在调用时,会保证被调度进程的上下文环境,待该进程获得时间后,再将该进程的上下文恢复到系统中。

串行的代码是逐行执行的,是确定的,而并发引入了不确定性。线程通信只能采用共享内存的方式,为了保证共享内存的有效性,可以加锁,但是这样又引入了死锁的风险。

并发的优势如下:

(1)可以充分利用CPU 核心的优势,提高程序的执行效率。

(2)并发能充分利用CPU 与其他硬件设备的异步性,如文件操作等。

下面介绍3种并发模式。

1**.多进程是操作系统层面的并发模式**

所有的进程都由内核管理。进程描述的是程序的执行过程,是运行着的程序。

一个进程其实就是一个程序运行时的产物。

电脑为什么可以同时运行那么多应用程序?手机为什么可以有那么多App 同时在后台刷新?

这是因为在它们的操作系统之上有多个代表着不同应用程序的进程在同时运行。

操作系统会为每个独立的程序创建一个进程,进程可以装下整个程序需要的资源。例如,程序执行的进度、执行的结果等,都可以放在里面。在程序运行结束后,再把进程销毁,然后运行下一个程序,周而复始。

进程在程序运行中是非常占用资源的,无论是否会用到全部的资源,只要程序启动了,就会被加载到进程中。

优势是进程互不影响,劣势是开销非常大。

2**.多线程属于系统层面的并发模式,也是使用最多、最有效的一种模式**

线程是在进程之内的,可以把它理解为轻量级的进程。它可以被视为进程中代码的执行流程。这样在处理程序的运行和记录中间结果时,就可以使用更少的资源。待资源用完,线程就会被销毁。

线程要比进程轻量级很多。一个进程至少包含一个线程。如果一个进程只包含一个线程,那么它里面的所有代码都只会被串行地执行。

每个进程的第一个线程都会随着该进程的启动而被创建,它们被称为其所属进程的主线程。同理,如果一个进程中包含

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

多个线程,那么其中的代码就可以被并发地执行。

除进程的第一个线程外,其他的线程都是由进程中已存在的线程创建出来的。也就是说,主线程之外的其他线程都只能由代码显式地创建和销毁。这需要我们在编写程序时进行手动控制。

优势是比进程开销小一些,劣势是开销仍然较大。

3**.**Goroutine

从本质上说,goroutine 是一种用户态线程,不需要操作系统进行抢占式调度。

在Go 程序中,Go 语言的运行时系统会自动地创建和销毁系统级的线程。

系统级线程指的是操作系统提供的线程,而对应的用户级线程(goroutine)指的是架设在系统级线程之上的,由用户(或者说我们编写的程序)完全控制的代码执行流程。

用户级线程的创建、销毁、调度、状态变更,以及其中的代码和数据都完全需要我们的程序自己去实现和处理,其优势如下:

(1)因为它们的创建和销毁不需要通过操作系统去做,所以速度很快,可以提高任务并发性。编程简单、结构清晰。

(2)由于不用操作系统去调度它们的运行,所以很容易控制,并且很灵活。

协程并发模型

在Go 语言中,不要通过共享数据来通信,恰恰相反,要通过通信的方式来共享数据。

Go 语言不仅有goroutine,还有强大的用来调度 goroutine、对接系统级线程的调度器。

调度器是 Go 语言运行时系统的重要组成部分,它主要负责统筹调配 Go 并发编程模型中的三个主要元素,即G**(**goroutine **的缩写)、Pprocessor 的缩写)和 M(**machine 的缩写),如下图所示。

其中,M 指的就是系统级线程。而P 指的是一种可以引用若干个G,且能够使这些G 在恰当的时机与M 进行对接,并得到运行的中介。

从宏观上说,由于P 的存在,G 和M 可以呈现出多对多的关系。当一个正在与某个M 对接并运行着的G,需要因某个事件(比如等待 I/O 或锁的解除)而暂停运行时,调度器总会及时地发现,并把这个G 与那个M 分离开,以释放计算资源供那些等待运行的G 使用。

而当一个G 需要恢复运行时,调度器又会尽快地为它寻找空闲的计算资源(包括M)并安排运行。另外,当M 不够用时,调度器会向操作系统申请新的系统级线程,而当某个M 已无用时,调度器又会负责把它及时地销毁。

程序中的所有 goroutine 也都会被充分地调度,其中的代码也都会被并发地运行,即使goroutine 数以十万计,仍然可以如此。

什么是主 goroutine**?它与我们自己启用的其他****goroutine** 有什么不同?

先来看下面的代码:

package main

import “fmt”

func main() {

for i := 0; i < 10; i++ {

go func() {

fmt.Println(i)

}()

}

}

这段代码只在main 函数中写了一条for 语句。这条for 语句中的代码会迭代运行10 次,并有一个局部变量i 表示当次迭代的序号,该序号是从0 开始的。在这条for 语句中仅有一条Go语句,在这条Go 语句中也仅有一条语句,该语句调用了fmt.Println 函数,想要打印出变量i 的值。

这个程序很简单,只有三条语句。这个程序被执行后,会打印出什么内容呢?

答案是:大部分计算机执行后,屏幕上不会有任何内容被打印出来。

99,36岁老码农现身说法相关推荐

  1. 现身说法:37岁老码农找工作

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 前几天突然接到dk的电话,要和我聊聊天. 他说他们部门调整,虽然最后他留了下来,但还是非常焦虑.人 ...

  2. 35岁老码农:老板,你看我还有机会吗?

    35岁的老张是一名老程序员,写了10几年的代码!突然有一天,老板把老张叫到办公室说:"老张啊,这些年你为公司付出了很多,我个人对你非常认可,不过今年公司业务不太好,利润大不如前.养不起这么多 ...

  3. 40岁老码农面试京东被淘汰,HR感叹:40岁混不到高管,都会被清退

    无论任何一个行业,都很少会在招聘的时候要一个年纪偏大的职员.特别是现在互联网的程序员,年过30如果还没实现财富自由的话,一边要面临的是即将被公司辞退的压力,另一边还要面临找不到工作无法养家糊口的压力. ...

  4. 42岁老码农找工作记录

    大家好,节日愉快呀!平时和朋友.同事总是会聊到35岁+的程序员都在干啥,各种说法都有,从CTO到滴滴司机不等.今天就给大家分享一位42老码农今年跳槽找工作的经历,文字不常,会有帮助的~ 以下是原文 给 ...

  5. 50 岁老码农:Python Bug 太多,我选 Rust 和 Go!

    作者 | 伍杏玲 责编 | 唐小引 出品 | CSDN(CSDNnews) 这里有一位IT界的老司机,不,是久经沙场的老码农: Linux专家,几十年来开发不少免费的开源软件:Linux之父的同窗好友 ...

  6. ”去他丫的北上广,老子要去成都定居了!“一名33岁老码农有话说

    "不后悔来成都,这里真的生活质量相比北京.深圳要高很多,巴适的很",这是老叶最近和我聊天聊的,老叶是一名工作12年的程序员,在北京,深圳都呆过,一直没有合适的城市让他心安或者是有归 ...

  7. 一个40岁老码农的总结,奋斗没有意义,选择大于努力

    今年刚好 40 岁,在一家著名外企做到技术专家的位置,在亲戚朋友眼中,俨然已算半个"成功人士",但内心深处,却无一刻不战战兢兢.我知道,自己就像一个风雨中的高跷人,哪怕一阵风,一个 ...

  8. 37岁码农现身说法:大龄程序员找工作

    前几天突然接到dk的电话,要和我聊聊天. 他说他们部门调整,虽然最后他留了下来,但还是非常焦虑.人无远虑必有近忧,他这次被刺激到了,想提高一下自己,以免下次再有类似的心惊肉跳.但怎么提高呢? 程序员第 ...

  9. 为什么越来越多的老码农准备上岸?

    点击"开发者技术前线",选择"星标" 让一部分开发者看到未来 作者   自由飞   来源   http://17bang.ren/Article 前几天突然接到 ...

  10. 我就是那个错过了乔布斯的变态老码农

    23岁,牛顿发现了万有引力. 36岁,爱因斯坦提出了相对论. 35岁,马云创办了阿里巴巴. 27岁,马化腾成立了腾讯. 31岁,李彦宏开始做百度. -- 28岁,马伟青收到了出版社的出书邀约. 马伟青 ...

最新文章

  1. 奥比中光Zora P1开发板评测报告
  2. 关于湖北工业大学图书馆联网配置的方法
  3. CentOS通过日志反查入侵(转)
  4. 树莓派3b配置耳机音频输出
  5. future career plan
  6. PropertiesUtil 获取文件属性值
  7. 推荐Java学习书籍
  8. 在建工程直接费用化_临夏州开展建设工程安全专项整治
  9. SQL Server 设计开发系列(文章索引)
  10. 开机后网络连接迟迟没有反映是怎么回事?
  11. PDF转jpg for MAC
  12. 【C语言打印三角形】
  13. 过 DNF TP 驱动保护(二)
  14. umi路由懒加载和权限验证(基于React)
  15. 蓝桥杯刷题冲刺 | 倒计时14天
  16. 【一周头条盘点】中国软件网(2018.1.29~2018.2.2)
  17. JS原型对象和JS原型链
  18. 5G边缘计算商用部署和运维关键技术
  19. Android绘图(一)基础篇
  20. UE-Vs转Rider for UE

热门文章

  1. linux 软件放什么目录,Linux 下的各种目录
  2. python 模拟登录超星强智系统
  3. 计算机键盘上的2个定位键,电脑键盘上Tab 键的神奇之处!(用途详解)
  4. 纵横捭阖C++之从异步谈起
  5. 评论(评价)数据库表的设计
  6. c语言算个人所得税的源代码,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  7. 2022年后人工智能八大应用方向
  8. 信息化知识中的重点:商业智能(BI)详解
  9. 在LINUX下面建立GPRS无线MODEM拨号
  10. 沧海的孤塔-chimera