最后,我认为问题是我试图
通过
在听众中
Go例程
从而使每个go例程具有与主线程的依赖性。工作解决方案最终变得如此简单:
func main(){
...
node_ip_port := "127.0.0.1:9000"
client_ip_port := "127.0.0.1:1000"
nodeChan := make(chan net.Conn, 20)
go func(ip_port string, nodeChan chan<- net.Conn) {
l, err := net.Listen("tcp", node_ip)
if err != nil {
log.Fatal("Had an error connecting to node", err)
}
for {
conn, _ := l.Accept()
kvChan <- conn
}
}(node_ip_port, nodeChan)
go func(ip_port string) {
l, err := net.Listen("tcp", ip_port)
if err != nil {
log.Fatal("Had an error connecting to client", err)
}
for {
conn, _ := l.Accept()
go rpc.ServeConn(conn)
}
}(client_ip_port)
// List of connected nodes
nodeList := list.New()
for {
node := <-nodeChan
nodeList.PushBack(node)
// My RPC functions use the nodes in this list to serve :-)
}
}