我创建了一个简单的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的输出可以在这里找到:
答案 0 :(得分:0)
在您的游乐场示例中,您使用for {}
来保持服务器永久运行。
这似乎剥夺了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()
}