Golang listenUDP使用BigTable连接阻止多个端口

时间:2017-07-02 19:57:35

标签: go gcloud grpc bigtable

我创建了一个简单的udp客户端,可以侦听多个端口并将请求保存到bigtable。

在你提出要求之前,先听听不同的端口是必不可少的。

在我加入bigtable之前,一切都很顺利。这样做之后,听众就完全阻止了。

我的精简代码,没有bigtable,看起来像这样:

func flow(port string) {

    protocol := "udp"
    udpAddr, err := net.ResolveUDPAddr(protocol, "0.0.0.0:"+port)
    if err != nil {
        fmt.Println("Wrong Address")
        return
    }

    udpConn, err := net.ListenUDP(protocol, udpAddr)
    if err != nil {
        fmt.Println(err)
    }
    defer udpConn.Close()

    for {
        Publish(udpConn, port)
    }
}

func main() {

    fmt.Print("Starting server.........")
    for i := *Start; i <= *End; i++ {
        x := strconv.Itoa(i)
        go flow(x)
    }
}

然而,这工作正常,只要我为bigtable添加以下内容,整个事情就会阻塞。如果我删除了创建监听器的go例程(这意味着我无法在多个端口上监听),它就可以工作。

func createBigTable() {
    ctx := context.Background()

    client, err := bigtable.NewClient(ctx, *ProjectID, *Instance)
    if err != nil {
        log.Fatal("Bigtable NewClient:", err)
    }

    Table = client.Open("x")

}

我设法通过在createBigTable func中添加一个查询来实现它,但程序后来仍然会阻塞。

我不知道这是bigtable,grpc的问题,还是我的做法。

非常感谢有关如何修复的建议。

---更新---

我发现问题不仅仅是BigTable - 当我打电话给gcloud pubsub时,我也有同样的问题。

---更新2 ---

在init函数中调用createBigtable(在主要功能之前):

func init() {
    createBigTable
}

---更新3 ---

sigquit的输出可以在这里找到:

https://pastebin.com/fzixqmiA

1 个答案:

答案 0 :(得分:0)

在您的游乐场示例中,您使用for {}来保持服务器永久运行。 这似乎剥夺了goroutines永远无法运行。 尝试使用例如一个WaitGroupmain()例程中产生控制权,让flow()例程处理传入的UDP数据包。

import (
    ...
    "sync"
    ...
)

...

func main() {

    fmt.Print("Starting server.")
    for i := *Start; i <= *End; i++ {
        x := strconv.Itoa(i)
        go flow(x)
    }

    var wg sync.WaitGroup
    wg.Add(1)
    wg.Wait()
}