这是一个包含我正在尝试使用的基本架构/流程的小示例程序。如何打印所有数字和“结束”消息?我试过在这里和那里放置关闭语句,但它要么不起作用,要么我对尝试关闭已经关闭的频道感到恐慌......
package main
import (
"fmt"
"time"
)
func main() {
d := make(chan uint)
go bar(d)
c1 := make(chan uint)
c2 := make(chan uint)
c3 := make(chan uint)
go foo(c1, d)
go foo(c2, d)
go foo(c3, d)
c1 <- 1
c2 <- 2
c3 <- 3
c1 <- 4
c2 <- 5
c3 <- 6
c1 <- 7
c2 <- 8
c3 <- 9
}
func foo(c chan uint, d chan uint) {
fmt.Println("foo start")
for stuff := range c {
time.Sleep(1)
d <- stuff * 2
}
fmt.Println("foo end")
}
func bar(d chan uint) {
fmt.Println("bar start")
for stuff := range d {
fmt.Printf("bar received %d\n", stuff)
}
fmt.Println("bar end")
}
我得到的输出看起来像这样。请注意最后一组数字和“结束”输出丢失。
foo start
bar start
foo start
foo start
bar received 6
bar received 2
bar received 4
bar received 12
bar received 8
bar received 10
在我的实际程序中,每个“foo”函数都在进行过滤和一堆繁重的字符串正则表达式。而且我需要“bar”功能,因为它具有根据时间戳重新排序和序列化打印的工作,因此输出不会交错。
慕哥9229398
慕的地8271018
相关分类