Go Routines及其并发性问题

时间:2015-02-24 00:09:49

标签: go broker

TL; DR接受并连接两个单独的连接SET。想要同时使用RPC。

我试图在我的计算机上创建半分布式系统。我现在正在处理的代码片段就像一个代理节点,换句话说,它始终接受来自端口的客户端连接。它还不断接受来自不同端口的后端节点连接。 我试图找到一种同时兼顾两者的方法,同时兼顾两者。我使用RPC和我尝试的方式是这样的: 主:

func main(){  
 ...  
 rpc.Register(myInterface)  
 l, err := net.Listen("tcp", client_port)  
 if err != nil {...}  
 go handleClients(l)  
 node_l, err := net.Listen("tcp", node_port)  
 if err != nil{...}   
 go setUpIncomingNodes(node_l, chan)  
 for{// add nodes to a list from chan} 
}

并发功能:

// Adds clients to be connected
func handleClients(listener net.Listener){
 for{
  conn, err :=listener.Accept()
  if err != nil{...}
  // Starts up a blocking (on that thread) RPC connection
  go rpc.serveConn(conn)
 }
}
func setUpIncomingNodes(node_listener net.Listener, incoming_nodes chan<- net.Conn){
 for{
  conn, err := node_listener.Accept()
  if err != nil{...}
  incoming_nodes <- conn     
 }
}

问题是它不会为第一个节点提供服务,直到第二个节点出现。我不明白为什么。此外,似乎只有一个连接可以发生,但我认为RPC服务于不同的端口(因此不会阻止它)。任何帮助都非常感激。

我尝试跟随this tutorial,但我发现情况太不同了,它也使用了不同版本的Go。我使用两种类型的节点/连接,其中类型A需要通过代理提供给类型B.

1 个答案:

答案 0 :(得分:1)

最后,我认为问题在于我试图在 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 :-)
  }
 }