我们可以在 Go 中使用 select 来接受来自不同侦听器的 Accept() 吗?
Can we use select to Accept() from different listeners in Go?
就像下面的代码:
for {
select {
case conn, err := listener1.Accept():
if err != nil {
log.Fatal(err)
}
go handleConn1(conn)
case conn, err := listener2.Accept():
if err != nil {
log.Fatal(err)
}
go handleConn1(conn)
}
}
虽然编辑告诉我 select
有问题
我们可以在 Go 中实现类似的东西吗?
select
仅适用于频道(在此处查看更多信息:https://gobyexample.com/select)
在您的情况下,您可以跨越两个 goroutine,以便每个 goroutine 等待一个侦听器的 Accept
并处理连接:
go func() {
for {
conn, err := listener1.Accept():
if err != nil {
log.Fatal(err)
}
handleConn1(conn)
}
}()
go func () {
for {
conn, err := listener2.Accept():
if err != nil {
log.Fatal(err)
}
handleConn2(conn)
}
}()
就像下面的代码:
for {
select {
case conn, err := listener1.Accept():
if err != nil {
log.Fatal(err)
}
go handleConn1(conn)
case conn, err := listener2.Accept():
if err != nil {
log.Fatal(err)
}
go handleConn1(conn)
}
}
虽然编辑告诉我 select
我们可以在 Go 中实现类似的东西吗?
select
仅适用于频道(在此处查看更多信息:https://gobyexample.com/select)
在您的情况下,您可以跨越两个 goroutine,以便每个 goroutine 等待一个侦听器的 Accept
并处理连接:
go func() {
for {
conn, err := listener1.Accept():
if err != nil {
log.Fatal(err)
}
handleConn1(conn)
}
}()
go func () {
for {
conn, err := listener2.Accept():
if err != nil {
log.Fatal(err)
}
handleConn2(conn)
}
}()