我遇到了控制通道(某种)问题。
我的程序的本质:
我不知道我将在运行时运行多少个 go 例程
我需要在设定的时间重新启动这些 go 例程,但是,它们也可能出错(然后重新启动),因此它们的时间将无法预测。
这些 go 例程会将消息放到单个通道上。
所以我所做的是创建一个简单的随机消息生成器,将消息放到一个通道上。当计时器启动时(测试的随机持续时间),我将一条消息放到一个控制通道上,该通道是一个结构有效载荷,所以我知道有一个关闭信号,并且它是例行公事;实际上,在再次开始Go例程之前,我会做一些我需要做的其他事情。
我的问题是:
我在反射中收到控制消息。选择循环
我没有(或无法)在我的randmsgs()循环中收到它
因此,我无法阻止我的randmsgs()去例行公事。
我相信我理解多个go例程可以从单个通道读取是正确的,因此我认为我误解了如何反映。选择大小写适合所有这些内容。
我的代码:
package main
import (
"fmt"
"math/rand"
"reflect"
"time"
)
type testing struct {
control bool
market string
}
func main() {
rand.Seed(time.Now().UnixNano())
// explicitly define chanids for tests.
var chanids []string = []string{"GR I", "GR II", "GR III", "GR IV"}
stream := make(chan string)
control := make([]chan testing, len(chanids))
reflectCases := make([]reflect.SelectCase, len(chanids)+1)
// MAKE REFLECT SELECTS FOR 4 CONTROL CHANS AND 1 DATA CHANNEL
for i := range chanids {
control[i] = make(chan testing)
reflectCases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(control[i])}
}
reflectCases[4] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(stream)}
// START GO ROUTINES
for i, val := range chanids {
runningFunc(control[i], val, stream, 1+rand.Intn(30-1))
}
// READ DATA
for {
o, recieved, ok := reflect.Select(reflectCases)
if !ok {
fmt.Println("You really buggered this one up...")
}
ty, err := recieved.Interface().(testing)
if err == true {
fmt.Printf("Read from: %v, and recieved close signal from: %s\n", o, ty.market)
// close control & stream here.
} else {
ty := recieved.Interface().(string)
fmt.Printf("Read from: %v, and recieved value from: %s\n", o, ty)
}
}
}
我为文字墙道歉,但我完全没有想法:(!
慕斯709654
相关分类