前面讲的都是一些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)相关推荐

  1. 串行和并行的区别_入门参考:从Go中的协程理解串行和并行

    本文转自公众号语言随笔,欢迎关注 入门参考:从Go中的协程理解串行和并行​mp.weixin.qq.com Go语言的设计亮点之一就是原生实现了协程,并优化了协程的使用方式.使得用Go来处理高并发问题 ...

  2. ONNX系列六 --- 在Java中使用可移植的ONNX AI模型

    目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...

  3. 从根上理解高性能、高并发(五):深入操作系统,理解高并发中的协程

    本文原题"程序员应如何理解高并发中的协程",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什么线程池 ...

  4. 如何理解高并发中的协程?协程的实现和历史

    <Libco是一个C/C++协程库,在微信服务中广泛使用> <协程到底是什么?> <如何理解高并发中的协程?协程的实现和历史> 目录 普通的函数 从普通函数到协程 ...

  5. python 协程可以嵌套协程吗_Python | 详解Python中的协程,为什么说它的底层是生成器?...

    今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...

  6. Python中的协程

    Python中的协程 文章目录 Python中的协程 一.什么是协程 1.概念 2.协程的好处 3.缺点 二.了解协程的过程 1.yield工作原理 2.协程在运行过程中有四个状态: 3.预激协程的装 ...

  7. 线程 协程 python_在Python 的线程中运行协程的方法

    在一篇文章 理解Python异步编程的基本原理 这篇文章中,我们讲到,如果在异步代码里面又包含了一段非常耗时的同步代码,异步代码就会被卡住. 那么有没有办法让同步代码与异步代码看起来也是同时运行的呢? ...

  8. Python 中 异步协程 的 使用方法介绍

    静觅 崔庆才的个人博客:Python中异步协程的使用方法介绍:https://cuiqingcai.com/6160.html Python 异步 IO .协程.asyncio.async/await ...

  9. golang协程goroutine

    协程goroutine 概念 协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复.相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那 ...

  10. tornado中的协程是如何工作的

    转自:http://blog.csdn.net/wyx819/article/details/45420017 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yiel ...

最新文章

  1. #感恩节# 华为云21天转型容器实战营免费开营
  2. Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗
  3. 8月19学习练习[两三个TableView并排显示]
  4. Java 实现常见排序算法
  5. 【转】[caffe]深度学习之图像分类模型AlexNet解读
  6. python改变turtle画笔方向的函数_哪个选项不能改变turtle画笔的运行方向?
  7. python屏幕文字识别_学会python就是如此任性,15行代码搞定图片文字识别,附源码...
  8. TSDF算法笔记(转)
  9. nodejs初探(四)实现一个多人聊天室
  10. 方舟生存进化服务器Linux,方舟生存进化官方服务器与私人服务器有什么区别
  11. 51ditu、清华地图以及Google地图
  12. 珠宝行业电子秤串口程序开发
  13. 入驻快手小店需要什么条件?快手小店如何开通?
  14. ps在html中的应用程序,Photoshop在网页设计中的应用
  15. TCP短连接与长连接
  16. 变量的定义以及数据类型
  17. python归一化函数_用numpy实现FFT归一化
  18. 网络流最大流初步-Push–relabel maximum flow algorithm
  19. 万拓存储数字校园存储解决方案
  20. 0.pytorch lightning 入门

热门文章

  1. JS - 移动设备终端的touch事件
  2. 怎样在VS2013/MFC中使用TeeChart绘图控件
  3. 常见算法之12---求a^n%p
  4. 23个超流行的jQuery相册插件收集
  5. 读取 [选项] 列内的默认数据的方法:
  6. Mac效率神器Alfred系列教程---剪切板历史记录
  7. 网易云上线新版容器服务,开放更多Kubernetes功能
  8. Android 自定义 View
  9. shell编程——判断条件
  10. Centos6.9如何安装vsftp