channel
声明语义
channel的零值为nil
,所以上述声明语句ch的值为nil
初始化方法
for循环
基本语法
如上的代码中,第1行定义了一个没有缓冲区的chan;第2行向chan中写入一个整数1;第3行从chan中读取数据。
注意:
如果channel没有缓冲区或缓冲区已满,向channel中写数据会导致当前线程阻塞,直到有其他线程读取数据
如果channel中没有数据,则读取数据时当前线程会被阻塞
select
select语句有较多的限制,其中一条就是每一个case语句必须是一个channel操作,大致结构如下:
上面的代码中,永远执行的都是default下的语句。因为ch无缓冲区,那么第一个case语句ch <- 1
向channel中写数据会导致线程阻塞,该语句判断为false。
再来看下面一段代码,该代码的效果是:随机地向channel中写入0或者1,然后再从channel中读出来。由于channel的缓冲区大小为1,所以写入一个数据是可以成功的。
使用示例
harbor中的jobservice有开启N个线程,用来执行镜像的复制任务。每一个任务都用一个id唯一标识,有一个channel(名字叫jobQueue),会有其他线程往jobQueue中不断写入jobId,然后N个线程中空闲的线程则从jobQueue中领取一个job。
workPool中有一个workChan和N个Worker,空闲的Worker会把自已加入到workChan中去:
Worker.Start()就是开启一个线程,执行循环任务,一直从自已的channel中读取jobId并处理
流程开始时,首先初始化workPool,生成N个worker,然后调用Start()函数开始循环任务:
Dispatch()函数一直从jobQueue中读取jobId,然后分发给workPool中的worker:
Last updated
Was this helpful?