我很难理解缓冲通道是如何工作的。基于下面的示例,我尝试一次使用2个线程来打印当前时间,每2个go调用之间大约有2秒的延迟:
package main
import "fmt"
import "time"
func main() {
returnCurrentTime := func() string {
return time.Now().String()
}
c := make(chan string, 2)
asyncReturnCurrentTime := func(c chan string) {
time.Sleep(2001 * time.Millisecond)
c <- returnCurrentTime()
}
for i := 1; i != 7; i++ {
go asyncReturnCurrentTime(c)
if(i % 3 == 0) {
fmt.Println(<- c)
fmt.Println(<- c)
fmt.Println(<- c)
fmt.Println()
}
}
}这就产生了
2013-02-27 03:17:50
2013-02-27 03:17:50
2013-02-27 03:17:50
2013-02-27 03:17:52
2013-02-27 03:17:52
2013-02-27 03:17:52关于秒数,我期望的是每2次go调用之间有2秒的延迟,在这种情况下,结果如下
2013-02-27 03:17:50
2013-02-27 03:17:50
2013-02-27 03:17:52 <- 3rd call with 2 buffer slots
2013-02-27 03:17:54
2013-02-27 03:17:54
2013-02-27 03:17:56 <- 3rd call with 2 buffer slots显然我误解了缓冲通道的概念,有没有人能解释一下我逻辑中的错误以及如何达到预期的结果?
谢谢
发布于 2013-02-27 10:29:54
实际上,您正在运行:
package main
import (
"fmt"
"time"
)
func main() {
returnCurrentTime := func() string {
return time.Now().String()
}
c := make(chan string, 2)
asyncReturnCurrentTime := func(c chan string) {
time.Sleep(2001 * time.Millisecond)
c <- returnCurrentTime()
}
go asyncReturnCurrentTime(c)
go asyncReturnCurrentTime(c)
go asyncReturnCurrentTime(c)
fmt.Println(<-c)
fmt.Println(<-c)
fmt.Println(<-c)
fmt.Println()
go asyncReturnCurrentTime(c)
go asyncReturnCurrentTime(c)
go asyncReturnCurrentTime(c)
fmt.Println(<-c)
fmt.Println(<-c)
fmt.Println(<-c)
fmt.Println()
}输出:
2013-02-26 21:28:22.069581655 -0500 EST
2013-02-26 21:28:22.069688722 -0500 EST
2013-02-26 21:28:22.069695217 -0500 EST
2013-02-26 21:28:24.070985411 -0500 EST
2013-02-26 21:28:24.070999309 -0500 EST
2013-02-26 21:28:24.071002661 -0500 ESTSend statements
在开始通信之前,将对通道和值表达式进行评估。通信阻塞,直到发送可以继续。
在尝试发送之前,会立即计算returnCurrentTime()表达式(时间戳)。这不是发送的时间戳。如果缓冲区已满,则发送可能会在稍后发生。
此外,测量实际的发送和接收时间,chan c的缓冲延迟将变得无关紧要:发送、发送、阻塞、接收、解除阻塞、发送。例如,
c <-; 2013-02-26 23:29:34.505456624 -0500 EST
c <-; 2013-02-26 23:29:34.505467030 -0500 EST
<- c; 2013-02-26 23:29:34.505468497 -0500 EST
c <-; 2013-02-26 23:29:34.505518015 -0500 EST
c <-; 2013-02-26 23:31:36.506659943 -0500 EST
c <-; 2013-02-26 23:31:36.506664832 -0500 EST
<- c; 2013-02-26 23:31:36.506669302 -0500 EST
c <-; 2013-02-26 23:31:36.506696540 -0500 ESThttps://stackoverflow.com/questions/15102643
复制相似问题