tnblog
首页
视频
资源
登录

golang chan,gouroutine 学习

5522人阅读 2021/2/8 12:10 总访问:129026 评论:0 收藏:0 手机
分类: golang

并发编程

多线程

  • 线程是属于操作系统进行管理, 也就是属于内核态
  • 线程之间切换, 需要发生用户态和内核态的切换
  • 当系统中有大量线程的时候,系统会变卡
  • 用户态的线程,支持大量的创建线程,也叫协程或gouroutine

gouroutine

一个操作系统对应用户态多个gouroutine
同时使用多个操作系统线程
操作系统线程对gouroutine时多对多的关系,即m:n

chan

本质上是个容器
var chanName chan type

chan 基本使用

  1. var ch chan int
  2. if ch == nil {
  3. fmt.Println("chan管道为空")
  4. }
  5. fmt.Printf("ch类型为:%T", ch)

chan 传入传出

  1. var ch chan int
  2. if ch == nil {
  3. fmt.Println("chan管道为空")
  4. }
  5. //这里我们初始化chan 并给出长度
  6. //如果长度没有给直接传入会报错
  7. ch = make(chan int, 1)
  8. ch <- 100
  9. fmt.Printf("ch类型为:%T\n", ch)
  10. data := <-ch
  11. fmt.Printf("ch=%v,data=%v", ch, data)
  1. var ch chan int
  2. if ch == nil {
  3. fmt.Println("chan管道为空")
  4. }
  5. // 这里我们初始化并没有给出长度
  6. // 但是我们新开了一个gouroutine 来传入,并外面有传出操作
  7. ch = make(chan int)
  8. go func() { ch <- 100 }()
  9. fmt.Printf("ch类型为:%T\n", ch)
  10. data := <-ch
  11. fmt.Printf("ch=%v,data=%v", ch, data)

chan 阻塞

只传入不传出就会造成阻塞

chan 实现 gouroutine同步

  1. //chan实现goroutine同步
  2. func goroutineSync() {
  3. var c chan bool = make(chan bool)
  4. go helloWord(c)
  5. <-c
  6. fmt.Println("goroutine 同步完成")
  7. }
  8. func helloWord(c chan bool) {
  9. fmt.Println("goroutine hello word ")
  10. c <- true
  11. }

chan 单向操作

  1. //chanel 的单向操作
  2. func singleChanel() {
  3. c := make(chan int)
  4. go writeChan(c)
  5. readChan(c)
  6. }
  7. func readChan(c <-chan int) {
  8. <-c
  9. fmt.Println("读取")
  10. }
  11. func writeChan(c chan<- int) {
  12. c <- 10
  13. fmt.Println("写入")
  14. }

chan 关闭

  1. close(c)

chan for range 循环

  1. //chanel 循环
  2. //这里程序会死锁,因为生产者没有传入,程序一直等待,故报错了
  3. func forRangeChan() {
  4. var c chan int = make(chan int)
  5. go func(a chan int) {
  6. for i := 0; i < 5; i++ {
  7. a <- i
  8. }
  9. }(c)
  10. for v := range c {
  11. fmt.Println(v)
  12. }
  13. }

chan 带缓冲区

  1. var c chan int =make(chan int ,1)

selcet 操作

  1. //select 操作
  2. /*
  3. 判断chan是否是空的
  4. 判断chan是否是满的
  5. case 随机策略
  6. */
  7. func selectChan() {
  8. ch1 := make(chan string)
  9. ch2 := make(chan string)
  10. go server1(ch1)
  11. go server2(ch2)
  12. time.Sleep(time.Second)
  13. select {
  14. case s1 := <-ch1:
  15. fmt.Println("ch1", s1)
  16. case s1 := <-ch2:
  17. fmt.Println("ch2", s1)
  18. default:
  19. fmt.Println("暂时没有管道插入")
  20. }
  21. }
  22. func server1(c chan<- string) {
  23. //time.Sleep(time.Second * 6)
  24. c <- "from server1"
  25. }
  26. func server2(c chan<- string) {
  27. //time.Sleep(time.Second * 3)
  28. c <- "from server2"
  29. }
评价

Python学习 1-安装

Ptyhon非常简单易用的面向对象的脚本语言,跨平台 入门简单python分2个版本 Python2、Python3。Python 2.7 将于 2020 年结...

Python学习 2-基本语法

基础:python脚本语言,不需要编译(像C#、Java、PHP、C++需要编译成机器可识别的语言), 而直接由解释器解释,很多地方类似...

Python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

Java学习路线

第一部分:Java开发介绍1. DOS常用命令2. JVM、JRE、JDK之间的关系3. Java开发环境的搭建:安装JDK,配置环境变量4. Java入...

Java web学习路线

第二阶段:JavaWeb第一部分:HTML51. html概述2. html基本标签3. 图片标签4. 超链接标签5. 表格标签6. 无序列表标签7. 有序...

英语学习mark

英语语法:http://www.yingyuyufa.com中考翻译练习https://wenku.baidu.com/view/087e774030b765ce0508763231126edb6f1a76f...

css3样式学习代码

上代码!上代码!不说了&lt;!DOCTYPEhtml&gt; &lt;htmllang=&quot;en&quot;&gt; &lt;head&gt; &lt;metacharset=&quot;UT...

Java学习 - Java语言简介

java语言简介1.了解java产生的背景2.了解java体系结构和组成3.了解Java API文档的使用4.搭建java语言的开发环境(重点)5....

Java学习 - Java语言基础

Java语言基础1.Scanner的用法2.java的程序结构3.java的数据类型4.java的运算符和表达式5.程序流程控制6.数组一 Scanner的用...

MongoDB 学习一(包含各种花样坑)

资源链接:链接:https://pan.baidu.com/s/1xgDnP2aHW1fNN9qLAP7OtQ提取码:4zm81,安装MongoDB (传统式的下一步)这里选Cu...

Java学习 - 类和对象

1.了解面向对象和面向过程的区别 2.理解什么是类以及创建类的语法 3.理解什么是对象以及如何创建 4.掌握什么是封装一 面向...

Java学习 - 继承与多态

1.继承 2.多态 3.构造方法 4.重载 5.重写 6.super与this的区别 7.static,final,abstract的用法 8.接口一 什么是继承 如:...

vue.js 学习日记第一章-安装vue开发环境

官网:https://cn.vuejs.org/v2/guide/ 这是一篇学习性文章,不定时更新,用来记录我学习vue.js的过程。 首先,是v...

vue.js 学习日记第二章-在vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第三章-vue中的简单事件及事件修饰符

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第二章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第四章-vue中文本框数据获取与绑定及computed计算属性

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第三章: http://www.tnblog.net/18323015640/article/details/2...
无论这个世界对你怎样,都请你一如既往的努力、勇敢、充满希望。
排名
25
文章
22
粉丝
5
评论
7
C# string 和String 的区别
剑轩 : 所以区别主要在哪里呢....
markdown 初步学习
剑轩 : 哇哦,真的喜欢你这个个性签名,很不错
pythoic 写法
剑轩 : 新年快乐啊
python拼接字符串八种
剑轩 : 手动点赞+1
python拼接字符串八种
雨雨雨雨雨辰 : 手动点赞
pythoic 写法
瑾语 : 你好
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
人是要整活的——没活了,可不就是死了么?