Golang listenUDP 多个端口阻塞与 BigTable 连接

Golang listenUDP multiple ports blocking with BigTable connection

我正在创建一个简单的 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 函数中添加一个查询使其工作,但该程序稍后仍会阻塞。

我不知道这是 bigtable、grpc 的问题还是我的处理方式的问题。

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

---更新---

我发现问题不仅仅与 BigTable 有关 - 我在调用 gcloud pubsub 时也遇到了同样的问题。

--- 更新 2 ---

createBigtable 在初始化函数中调用(在主函数之前):

func init() {
    createBigTable
}

--- 更新 3 ---

可以在此处找到 sigquit 的输出:

https://pastebin.com/fzixqmiA

在您的 playground 示例中,您正在使用 for {} 使服务器永远保持 运行ning。 这似乎剥夺了 goroutines 到达 运行 的权利。 尝试使用例如WaitGroup 放弃对 main() 例程的控制,让 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()
}