【发布时间】: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 的输出可以在这里找到:
【问题讨论】:
-
如何在flow/main中集成“createBigTable”功能?
-
它在 init 函数中实际上还有其他一些东西。但这不仅仅是 BigTable - 向 PubSub 添加连接器也会产生问题。
-
附言。我已经转移了电话,但它仍在干扰。
-
我刚刚解释了它是在init函数中调用的,它在main函数之前调用。不管怎样,我已经更新了。
-
明显在main函数之前?