这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述:@H_404_3@
信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。@H_404_3@
这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 channel 是一个管道或者先进先出队列,非常简单且轻量。channel 并不是 Golang 首创的。它同样作为内置功能出现在其他语言中。在大多数情况下,它是一个又大、又笨、又复杂的消息队列系统的一个功能。@H_404_3@
下面就来一起找点乐子吧!@H_404_3@
@H_404_3@
最常见的方式:生产者/消费者
生产者产生一些数据将其放入 channel;然后消费者按照顺序,一个一个的从 channel 中取出这些数据进行处理。这是最常见的 channel 的使用方式。当 channel 的缓冲用尽时,生产者必须等待(阻塞)。换句话说,若是 channel 中没有数据,消费者就必须等待了。@H_404_3@
这个例子的源代码在这里。最好下载到本地运行。@H_404_3@
生产者@H_404_3@
func
int
)
defer
for
c
time
.Now().Unix()
}
}
|
生产者生成“max”个 int64 的数字,并且将其放入 channel “c” 中。需要注意的是,这里用 defer 在函数推出的时候关闭了 channel。@H_404_3@
消费者@H_404_3@
fmt.Println(v)
}
}
从 channel 中一个一个的读取 int64 的数字,然后将其打印在屏幕上。当 channel 被关闭后,变量“ok”将被设置为“false”。@H_404_3@
自增长 ID 生成器
当生让产者可以顺序的生成整数。它就是一个自增长 ID 生成器。我将这个功能封装成了一个包。并将其代码托管在这里。使用示例可以参考@L_301_5@的代码。@H_404_3@
func
New(start,step
)
(ai *AutoInc) {
ai
= &AutoInc{
start:
start,
step:
step,
running:
true
,
queue:
make(chan
}
go
ai.process()
return
}
func
(ai *AutoInc) process() {
defer
func() {recover()}()
i := ai.start; ai.running ; i=i+ai.step {
ai.queue
<- i
}
}
func
(ai *AutoInc) Id()
int
{
return
<-ai.queue
}
func
(ai *AutoInc) Close() {
ai.running
=
false
close(ai.queue)
}