【问题标题】:Golang listenUDP multiple ports blocking with BigTable connectionGolang listenUDP 多个端口阻塞与 BigTable 连接
【发布时间】:2017-07-02 19:57:34
【问题描述】:

我正在创建一个简单的 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 在 init 函数中被调用(在主函数之前):

func init() {
    createBigTable
}

--- 更新 3 ---

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

https://pastebin.com/fzixqmiA

【问题讨论】:

  • 如何在flow/main中集成“createBigTable”功能?
  • 它在 init 函数中实际上还有其他一些东西。但这不仅仅是 BigTable - 向 PubSub 添加连接器也会产生问题。
  • 附言。我已经转移了电话,但它仍在干扰。
  • 我刚刚解释了它是在init函数中调用的,它在main函数之前调用。不管怎样,我已经更新了。
  • 明显在main函数之前?

标签: go gcloud grpc bigtable


【解决方案1】:

在您的 Playground 示例中,您使用 for {} 来保持服务器永远运行。 这似乎使 goroutine 无法运行。 尝试使用例如一个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()
}

【讨论】:

  • 看起来这已经排序了,我无法正确测试,但使用 nc - 它可以工作。谢谢!!!!
猜你喜欢
  • 1970-01-01
  • 2017-04-18
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2020-04-13
  • 1970-01-01
相关资源
最近更新 更多