Golang 入门系列(六)理解Go中的协程(Goroutine)
前面讲的都是一些Go 语言的基础知识,感兴趣的朋友可以先看看之前的文章。https://www.cnblogs.com/zhangweizhong/category/1275863.html。
今天就来讲讲go 里面的高级功能,也是go语言重要的特性:Go协程(Goroutine)。
什么是Go协程
Go协程(Goroutine)是与其他函数同时运行的函数。可以认为Go协程是轻量级的线程,由Go运行时来管理。
在函数调用前加上go关键字,这次调用就会在一个新的goroutine中并发执行。当被调用的函数返回时,这个goroutine也自动结束。听着感觉像C# 中的Task。
需要注意的是,如果这个函数有返回值,那么这个返回值会被丢弃。
Go 协程(Goroutine)之间通过信道(channel)进行通信,简单的说就是多个协程之间通信的管道。信道可以防止多个协程访问共享内存时发生资源争抢的问题。
如何使用
package mainimport ( "fmt""time" )func hello() { fmt.Println("Hello world goroutine") } func main() { go hello()time.Sleep(1 * time.Second)fmt.Println("main function") }
Channel(管道)
Channel(管道) 可以被认为是协程之间通信的管道。与水流从管道的一端流向另一端一样,数据可以从信道的一端发送并在另一端接收。
1. 定义
每个channel都有一个类型。此类型是允许信道传输的数据类型。channel是类型相关的,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。
2. 声明
a. 我们需要通过内置函数 make
来创建一个信道。
下面的代码声明了一个信道:
var ch chan int
b. 与其他变量定义一样,快速声明也是定义信道的一种有效而简洁的方式:
a := make(chan int)
c. 创建一个带缓冲的channel
c := make(chan int, 1024)// 从带缓冲的channel中读数据 for i:=range c {... }
3. 发送和接收数据
通过信道发送和接收数据的语法如下:
data := <- a // 从channel a 读取数据 a <- data // 将数据写入到 channel a
箭头的指向说明了数据是发送还是接收。
完整例子
下面就直接说说,Goroutine和channel 共同使用的完整例子:
package mainimport ("fmt""time" )func Producer(queue chan<- int) {for i := 0; i < 10; i++ {queue <- i //写入fmt.Println("create :", i)} }func Consumer(queue <-chan int) {for i := 0; i < 10; i++ {v := <-queue // 读出fmt.Println("receive:", v)} }func main() {queue := make(chan int, 88)go Producer(queue)go Consumer(queue)time.Sleep(1 * time.Second) }
最后
以上,就简单的介绍了Go语言中的协程(Goroutine)和信道(channel)。这两个功能特性,是go语言中重要的特性。大家可以写写其他的例子,熟悉掌握。
Golang 入门系列(六)理解Go中的协程(Goroutine)相关推荐
- 串行和并行的区别_入门参考:从Go中的协程理解串行和并行
本文转自公众号语言随笔,欢迎关注 入门参考:从Go中的协程理解串行和并行mp.weixin.qq.com Go语言的设计亮点之一就是原生实现了协程,并优化了协程的使用方式.使得用Go来处理高并发问题 ...
- ONNX系列六 --- 在Java中使用可移植的ONNX AI模型
目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...
- 从根上理解高性能、高并发(五):深入操作系统,理解高并发中的协程
本文原题"程序员应如何理解高并发中的协程",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什么线程池 ...
- 如何理解高并发中的协程?协程的实现和历史
<Libco是一个C/C++协程库,在微信服务中广泛使用> <协程到底是什么?> <如何理解高并发中的协程?协程的实现和历史> 目录 普通的函数 从普通函数到协程 ...
- python 协程可以嵌套协程吗_Python | 详解Python中的协程,为什么说它的底层是生成器?...
今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...
- Python中的协程
Python中的协程 文章目录 Python中的协程 一.什么是协程 1.概念 2.协程的好处 3.缺点 二.了解协程的过程 1.yield工作原理 2.协程在运行过程中有四个状态: 3.预激协程的装 ...
- 线程 协程 python_在Python 的线程中运行协程的方法
在一篇文章 理解Python异步编程的基本原理 这篇文章中,我们讲到,如果在异步代码里面又包含了一段非常耗时的同步代码,异步代码就会被卡住. 那么有没有办法让同步代码与异步代码看起来也是同时运行的呢? ...
- Python 中 异步协程 的 使用方法介绍
静觅 崔庆才的个人博客:Python中异步协程的使用方法介绍:https://cuiqingcai.com/6160.html Python 异步 IO .协程.asyncio.async/await ...
- golang协程goroutine
协程goroutine 概念 协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复.相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那 ...
- tornado中的协程是如何工作的
转自:http://blog.csdn.net/wyx819/article/details/45420017 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yiel ...
最新文章
- #感恩节# 华为云21天转型容器实战营免费开营
- Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗
- 8月19学习练习[两三个TableView并排显示]
- Java 实现常见排序算法
- 【转】[caffe]深度学习之图像分类模型AlexNet解读
- python改变turtle画笔方向的函数_哪个选项不能改变turtle画笔的运行方向?
- python屏幕文字识别_学会python就是如此任性,15行代码搞定图片文字识别,附源码...
- TSDF算法笔记(转)
- nodejs初探(四)实现一个多人聊天室
- 方舟生存进化服务器Linux,方舟生存进化官方服务器与私人服务器有什么区别
- 51ditu、清华地图以及Google地图
- 珠宝行业电子秤串口程序开发
- 入驻快手小店需要什么条件?快手小店如何开通?
- ps在html中的应用程序,Photoshop在网页设计中的应用
- TCP短连接与长连接
- 变量的定义以及数据类型
- python归一化函数_用numpy实现FFT归一化
- 网络流最大流初步-Push–relabel maximum flow algorithm
- 万拓存储数字校园存储解决方案
- 0.pytorch lightning 入门