Go语言学习之goroutine详解
什么是goroutine?
Goroutine是建立在线程之上的轻量级的抽象。它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法。相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的。在golang中创建一个goroutine非常简单,使用“go”关键字即可:
package mainimport ( "fmt" "time")func learning() { fmt.Println("My first goroutine")}func main() { go learning() /* we are using time sleep so that the main program does not terminate before the execution of goroutine.*/ time.Sleep(1 * time.Second) fmt.Println("main function")}
这段代码的输出是这样的:
My first goroutinemain function
如果把Sleep去掉的话,输出就会变成:
main function
这是因为,和线程一样,golang的主函数(其实也跑在一个goroutine中)并不会等待其它goroutine结束。如果主goroutine结束了,所有其它goroutine都将结束。
下面看下Go语言学习之goroutine的相关内容。
协程Coroutine
特点
- 轻量级的“线程”
- 非抢占式多任务处理,由协程主动交出控制权
- 编译器/解释器/虚拟机层面的多任务,非操作系统
- 多个协程可以在一个或多个线程上执行
go关键字开启一个协程
func main() { for i := 0; i < 10; i++ { go func(i int) { for { fmt.Println(i) } }(i) } time.Sleep(time.Millisecond) }
goroutine可能的切换点(转让控制权)
- I/O,select
- channel
- 等待锁
- 函数调用(有时)
- routime.Goshed()
- 只是参考,不能保证切换,不能保证在其他地方不切换
总结
以上所述是小编给大家介绍的Go语言学习之goroutine详解,希望对大家有所帮助!
相关推荐
-
go语言执行等待直到后台goroutine执行完成实例分析
本文实例分析了go语言执行等待直到后台goroutine执行完成的用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: var w sync.WaitGroup w.Add(2) go func() { // do something w.Done() } go func() { // do something w.Done() } w.Wait() 希望本文所述对大家的Go语言程序设计有所帮助.
-
Go语言轻量级线程Goroutine用法实例
本文实例讲述了Go语言轻量级线程Goroutine用法.分享给大家供大家参考.具体如下: goroutine 是由 Go 运行时环境管理的轻量级线程. go f(x, y, z) 开启一个新的 goroutine 执行 f(x, y, z) f,x,y 和 z 是当前 goroutine 中定义的,但是在新的 goroutine 中运行 f. goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步. sync 提供了这种可能,不过在 Go 中并不经常用到,因为有其他的办法.(以
-
Go语言学习之goroutine详解
什么是goroutine? Goroutine是建立在线程之上的轻量级的抽象.它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法.相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的.在golang中创建一个goroutine非常简单,使用"go"关键字即可: package mainimport ( "fmt" "time")func learning() { fmt.Println("My firs
-
C语言算法学习之双向链表详解
目录 一.练习题目 二.算法思路 1.设计浏览器历史记录 2.扁平化多级双向链表 3.展平多级双向链表 4.二叉搜索树与双向链表 一.练习题目 题目链接 难度 1472. 设计浏览器历史记录 ★★★☆☆ 430. 扁平化多级双向链表 ★★★☆☆ 剑指 Offer II 028. 展平多级双向链表 ★★★☆☆ 剑指 Offer 36. 二叉搜索树与双向链表 ★★★★☆ 二.算法思路 1.设计浏览器历史记录 1.这是一个模拟题: 2.初始化生成一个头结点,记录一个当前结点: 3.向前 和 向后 是两
-
Go语言基础学习之指针详解
目录 1. 什么是指针 2. 指针地址 & 指针类型 3. 指针取值 4. 空指针 5. make 6. new 7. make 和 new 的区别 8. 问题 今天来说说 Go 语言基础中的指针. Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 1. 什么是指针 Go 语言中,一个指针变量指向了一个值的内存地址.和 C.C++ 中的指针不同,Go 语言中的指针不能进行计算和偏移操作. Go 语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一
-
Linux 下C语言连接mysql实例详解
Linux 下C语言连接mysql实例详解 第一步: 安装mysql, 参考:http://www.jb51.net/article/39190.htm 第二步: 安装mysql.h函数库 sudo apt-get install libmysqlclient-dev 执行之后就可以看到/usr/include/MySQL目录了 然后开始我们的链接. 首先看我的数据库 mysql> show databases; +--------------------+ | Database | +----
-
C语言柔性数组实例详解
本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值.分享给大家供大家参考.具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 不完整类型 C和C++对于不完
-
Java Spring5学习之JdbcTemplate详解
一.JdbcTemplate Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 二.实战 2.1 引入依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.24</version> </dependency> <!-
-
C语言 动态分配数组案例详解
目录 一维动态数组的创建: 二维数组的创建: 很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相当不好的习惯,甚至可能导致编写的程序出现一些致命的错误.尤其对于搞嵌入式的人来所,嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能,所以高效的使用内存对我们来说是很重要的.那么我们在自己编写C语言代码的时候就应该学会使用动态数组,这也就是我这篇博客要给大家讲的,
-
Go语言空结构体详解
目录 前言 什么是空结构体 特点 地址相同 大小为0 原理探究 使用场景 集合(Set) channel中信号传输 总结 前言 在使用 Go 语言开发过程中,我们不免会定义结构体,但是我们定义的结构体都是有字段的,基本不会定义不包含字段的 空结构体.你可能会反过来问,没有字段的空结构体有什么用呢?那么我们这篇文章就来研究下空结构体吧! 注:本文基于go 1.14.4 分析 什么是空结构体 我们说不包含任何字段的结构体叫做空结构体,可以通过如下的方式定义空结构体: 原生定义 var a struc
-
C语言数据结构之二叉树详解
目录 1. 树概念及结构 1.1树概念 1.2树的表示 2. 二叉树概念及结构 2.1概念 2.2数据结构中的二叉树 2.3特殊的二叉树 2.4二叉树的存储结构 2.5二叉树的性质 3. 二叉树顺序结构及概念 3.1二叉树的顺序结构 3.2堆的概念及结构 3.3堆的实现 4. 二叉树链式结构及实现 4.1二叉树链式结构的遍历 4.2二叉树的链式实现 1. 树概念及结构 1.1树概念 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看起来像一棵
-
C语言二叉树的概念结构详解
目录 1.树的概念及结构(了解) 1.1树的概念: 1.2树的表示法: 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.2二叉树的性质 2.3二叉树的顺序存储 2.4二叉树的链式存储 3.二叉树链式结构的实现 3.1二叉树的前中后序遍历 3.2求二叉树的节点个数 3.3求二叉树的叶子节点个数 3.4销毁二叉树 1.树的概念及结构(了解) 1.1树的概念: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看起来像一棵倒挂的树
随机推荐
- 揭开面纱看看黑客用哪些工具(2)
- 正则表达式提取图片路径 并过滤掉指定字符的写法
- 批处理 API实现文件下载的代码第1/2页
- ORACLE EXP不能导出空表的原因分析及解决方法
- 运行page页面时的事件执行顺序及页面的回发与否深度了解
- 正则表达式,提取网页中的链接地址
- Python基于Matplotlib库简单绘制折线图的方法示例
- C#将Unicode编码转换为汉字字符串的简单方法
- 高效的mysql分页方法及原理
- Kindeditor在线文本编辑器如何过滤HTML
- Java实现文件压缩与解压的示例[zip格式,gzip格式]
- 用vnc实现Windows远程连接linux桌面之服务器配置
- C# JsonHelper 操作辅助类,拿来直接用
- linux 安装pypy , virtualenv及使用方法
- android使用Jsoup 抓取页面的数据
- 收集的侃侃的歌46首,照片、侃侃新专辑 下载试听
- java单元测试JUnit框架原理与用法实例教程
- 详解Android的反编译和代码混淆
- python数字图像处理之骨架提取与分水岭算法
- JavaScript new对象的四个过程实例浅析