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 的输出:
在您的 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()
}
我正在创建一个简单的 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 的输出:
在您的 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()
}