《Go语言编程》一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现。
libtask库的channel的数据结构如下:
  1. struct Alt
  2. {
  3. Channel *c;
  4. void *v;
  5. unsigned int op;
  6. Task *task;
  7. Alt *xalt;
  8. };
  9. struct Altarray
  10. {
  11. Alt **a;
  12. unsigned int n;
  13. unsigned int m;
  14. };
  15. struct Channel
  16. {
  17. unsigned int bufsize;
  18. unsigned int elemsize;
  19. unsigned char *buf;
  20. unsigned int nbuf;
  21. unsigned int off;
  22. Altarray asend;
  23. Altarray arecv;
  24. char *name;
  25. };

我们可以看到channel的基本组成如下:
  内存缓存,用于存放元素;
  发送队列;
  接受队列。

书中罗列完channel的结构后没有深入讲解如何在channel这个结构上进行通信的过程。其实结合书中前面介绍的内容task(协程)的通信过程已经不言而明了。
但是从学习者的角度,当然是把这个问题讲解的越明白越好。接下来我试着介绍一下task(协程)是如何在这个channel的基础上通信的。
对于一个往channel里写数据的情况:



对于一个从channel里读数据的情况:


注意:以上两个流程都是基于书中对协程的工作原理和channel数据结构的介绍后我个人脑补的,并没有去翻看libtask的代码。很可能存在疏漏,只应当把这两个流程作为理解协程工作方式的参照。

go lang学习笔记——channel机理及调度理解的更多相关文章

  1. libtask channel机理及调度理解

    学习golang的时候libtask库的代码是一定要看的,需要深入理解chan和携程的运行机制,下面就结合libtask的源码说明下运行原理,如果理解的有偏差欢迎指正 下面是libtask中Chann ...

  2. LDA主题模型学习笔记5:C源代码理解

    1.说明 本文对LDA原始论文的作者所提供的C代码中LDA的主要逻辑部分做凝视,原代码可在这里下载到:https://github.com/Blei-Lab/lda-c 这份代码实现论文<Lat ...

  3. go 学习笔记之10 分钟简要理解 go 语言闭包技术

    闭包是主流编程语言中的一种通用技术,常常和函数式编程进行强强联合,本文主要是介绍 Go 语言中什么是闭包以及怎么理解闭包. 如果读者对于 Go 语言的闭包还不是特别清楚的话,可以参考上一篇文章 go ...

  4. RHCA学习笔记:RH442-Unit8进程与调度

      UNIT 8  Processes and the Scheduler 进程与调度 学习目标 A. CPU cache 与Service time之间的关系 B. 分析应用程序使用CPU cach ...

  5. Java NIO学习笔记---Channel

    Java NIO 的核心组成部分: 1.Channels 2.Buffers 3.Selectors 我们首先来学习Channels(java.nio.channels): 通道 1)通道基础 通道( ...

  6. ReactiveX 学习笔记(12)调度器

    Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...

  7. Cocos2d-x学习笔记(五)调度

    在init方法中增加下边的代码,建议使用schedule函数,而不是scheduleUpdate函数,因为,后者默认是调用update函数,在如果有多个函数需要调度时,不是很灵活. auto labe ...

  8. GO Lang学习笔记 - 基础知识

    Go lang Learn Note 标签(空格分隔): Go Go安装和Go目录 设置环境变量GOROOT和GOPATH,前者是go的安装目录,后者是开发工作目录.go get包只会将包下载到第一个 ...

  9. 转 zigbee学习笔记---Channel、PANID、发射功率及其它参数

    现对z-stack里几个网络参数的设置以及如何获取总结一下.信道配置:Zigbee在3个频段定义了27个物理信道:868MHz频段中定义了1个20Kb/s信道,915MHz频段中定义了10个40Kb/ ...

随机推荐

  1. hbase与Hadoop

    Hbase是一种低延迟的在线系统,Hadoop是优化吞吐量的离线系统.这种互补关系造就了一种强大的.灵活的数据平台,可以用来搭建水平扩展的数据应用.

  2. Hbase负载均衡流程以及源码

    hmater负责把region均匀到各个region server .hmaster中有一个线程任务是专门处理负责均衡的,默认每隔5分钟执行一次. 每次负载均衡操作可以分为两步: 生成负载均衡计划表 ...

  3. [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySQL+PHP) Part IV

    接下来我们去下载 WorePress 用最新的 3.7.1 下载地址是:http://cn.wordpress.org/wordpress-3.7.1-zh_CN.zip 我们先建立一个文件夹 /va ...

  4. Android判断横屏竖屏代码

    // 判断Android当前的屏幕是横屏还是竖屏.横竖屏判断 if (this.getResources().getConfiguration().orientation == Configurati ...

  5. IOS学习4

    ---恢复内容开始--- UIScrollView 屏幕展示有限,超出一个屏时用户可滚动查看过多部分.UIView不具备滚动功能. -取消autolayout -设置CGSize contentSiz ...

  6. Debug.print的用法

    使用Debug.print可以用来更好的调试VBA程序 通过ALT+F11代开VBA编程窗口) 插入模块,接着在窗口中输入以下代码,按F5执行 Sub Excute() Debug.Print * + ...

  7. oracle 几个时间函数探究

    近来经常用到时间函数,在此写一个笔记,记录自己的所得,希望也对您有所帮助. 1.对于一个时间如 sysdate:2015/1/30 14:16:03如何只得到年月日,同时它的数据类型不变化呢? 最容易 ...

  8. IOS中 如何去除Tabview里面cell之间的下划线

    可以利用Tabview的separatorStyle属性来设置,选择其中的UITableViewCellSeparatorStyleNone 即可去除cell之间的下划线 self.tableView ...

  9. windows phone 8.1开发笔记之Toast

    Toast(吐司)是wp屏幕上端弹出来的临时通知,他会存在7秒钟的时间,可以快速定位到用户需要的位置(当然是由开发者设置的) 1.创建一个Toast now,需要将你的app设置支持Toast 否则即 ...

  10. Entity Framework学习笔记(四)----Linq查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...