golang channel的使用以及调度原理

为了并发的goroutines之间的通讯,golang使用了管道channel。

    可以通过一个goroutines向channel发送数据,然后从另一个goroutine接收它。

    通常我们会使用make来创建channel   -----   make(chan valType, [size])。

        写入 c <- data

        读取 data := <-c

Golang的channel分为缓冲和非缓冲的两种。主要区别:缓冲chanel是同步的,非缓冲channel是非同步的。

    举个例子:

        c1 := make(chan int)      // 无缓冲: c1 <- 1,当前协程阻塞。

        c2 := make(chan int, 1)   // 有缓冲: c2 <- 1,当前协程不会阻塞,c2 <- 2,此时1没有被取走,当前协程才阻塞。

备注:

    1、给一个nil channel发送数据,造成永远阻塞。

    2、从一个nil channel接收数据,造成永远阻塞。

    3、给一个已经关闭的channel发送数据,引起panic。

    4、从一个已经关闭的channel接收数据,立即返回一个零值(false : bool, 0 : int, 0.0 : float, "" : string, nil : pointer, function, interface, slice, channel, map)。

    5、channel关闭多次会引起panic,channel不能close大于1次。

    6、可以用两个返回值(valeu, b := <-c)来捕获channel是否关闭,b取值false或true。

缓冲channel的调度:

    一、写数据:

        1、协程1往channel写数据,buffer为空,读队列为空,直接写入buffer并返回。

        2、协程1往channel写数据,buffer为空,读队列非空(协程2阻塞在读队列),协程1将数据交给协程2并唤醒协程2等待调度,协程1返回,调度协程2取得数据并返回。

        3、协程1往channel写数据,buffer非空未满,直接写入buffer并返回。

        4、协程1往channel写数据,buffer满,加入写队列,阻塞当前协程1,等待有其他协程n从channel读数据。

    二、读数据:

        1、协程2从channel读数据,buffer非空,写队列非空(协程1阻塞在写队列),唤醒协程1等待调度,协程2从buffer读取数据并返回,调度协程1将数据写入buffer并返回。

        2、协程2从channel读数据,buffer非空,写队列空,从buffer读取数据并返回。

        3、重复步骤2直至buffer空。

            3.1、若写队列为空,加入读队列,阻塞当前协程2,等待有其他协程n往channel写数据。

            3.2、若写队列非空(协程1阻塞在写队列),协程2从写队列取出数据并唤醒协程1等待调度,协程2携带数据返回,调度协程1返回。

非缓冲channel的调度:

    一、写数据:

        1、协程1往channel写数据,读队列为空,加入写队列,阻塞当前协程1,等待有其他协程n从channel读数据。

        2、协程1往channel写数据,读队列非空(协程2阻塞在读队列),协程1将数据交给协程2并唤醒协程2等待调度,协程1返回,调度协程2取得数据并返回。

    二、读数据:

        1、协程2从channel读数据,写队列非空(协程1阻塞在写队列),协程2从写队列取出数据并唤醒协程1等待调度,协程2携带数据返回,调度协程1返回。

        2、协程2从channel读数据,写队列为空,加入读队列,阻塞当前协程2,等待有其他协程n往channel写数据。

golang channel的使用以及调度原理的更多相关文章

  1. golang channel原理

    channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...

  2. Erlang的调度原理(译文)

    原文 http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html 免爬墙链接 http://www.diku ...

  3. 弄懂goroutine调度原理

    goroutine简介 golang语言作者Rob Pike说,"Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法.一个运行的程序由一个或更多个go ...

  4. 图解Go协程调度原理,小白都能理解

    阅读本文仅需五分钟,golang协程调度原理,小白也能看懂,超实用. 什么是协程 对于进程.线程,都是有内核进行调度,有CPU时间片的概念,进行抢占式调度.协程,又称微线程,纤程.英文名Corouti ...

  5. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  6. [golang]Golang实现高并发的调度模型---MPG模式

    Golang实现高并发的调度模型---MPG模式 传统的并发形式:多线程共享内存,这也是Java.C#或者C++等语言中的多线程开发的常规方法,其实golang语言也支持这种传统模式,另外一种是Go语 ...

  7. golang channel关闭后,是否可以读取剩余的数据

    golang channel关闭后,其中剩余的数据,是可以继续读取的. 请看下面的测试例子. 创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channe ...

  8. go语言之行--golang核武器goroutine调度原理、channel详解

    一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...

  9. [GO语言的并发之道] Goroutine调度原理&Channel详解

    并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go ...

随机推荐

  1. linux下卸载已安装的软件

    1.先查询该软件是否安装,是否存在 rpm -qa | grep -i teamview 2.根据一中的结果(软件包名称),执行如下命令 rpm -e [软件包名]

  2. Python自动化测试、性能测试成长路线图

    Python自动化测试成长路线图 性能测试成长路线图

  3. Linux 6.4 设置yum 为centOS源

    一. 删除Redhat 自带的yum // root 用户执行 rpm -aq|grep yum|xargs rpm -e --nodeps 二 .下载CentOS 的 yum 安装文件 wget h ...

  4. Java基础系列--final关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...

  5. MysqL读写分离的实现-Mysql proxy中间件的使用

    为什么要架设读写分离,这里不做多余的说明,想了解具体原理,请百度或者参考其他帖子.在这里只做大概的配置说明,测试中使用三台服务器 192.168.136.142   主服务器 192.168.136. ...

  6. POJ - 1062 昂贵的聘礼 Dijkstra

    思路:构造最短路模型,抽象出来一个源点,这个源点到第i个点的费用就是price[i],然后就能抽象出图来,终点是1. 任意两个人之间都有等级限制,就枚举所有最低等级限制,然后将不再区间[min_lev ...

  7. 使用lambda编程之延迟执行

    使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点. 所有的lambda表达式都是延迟执行的.毕竟,如果你希望立即执行一段代码,那就没有必要使用lambda表达式了.延迟执行代码的 ...

  8. ehcache的基本使用及Spring整合

    1.ehcache:百度百科这样解释的,EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.总的来说,他的出现就是减少对数据 ...

  9. 运行web项目端口占用问题

    ---恢复内容开始--- 有时候运行web项目会提示8080端口已经被占用这一类问题(Error running Tomcat8: Address localhost:1099 is already ...

  10. 快速排序(QuickSort)

    1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原 ...