gpt4 book ai didi

select - 从 Go channel 获取值(value)

转载 作者:IT王子 更新时间:2023-10-29 02:18:17 24 4
gpt4 key购买 nike

我有一个 go-routine,它正在监听 TCP 连接并将这些连接发送回主循环的 channel 。我在 go-routine 中执行此操作的原因是使此监听成为非阻塞的并且能够同时处理事件连接。

我已经使用带有空默认情况的 select 语句实现了这一点,如下所示:

go pollTcpConnections(listener, rawConnections)

for {
// Check for new connections (non-blocking)
select {
case tcpConn := <-rawConnections:
currentCon := NewClientConnection()
pendingConnections.PushBack(currentCon)
fmt.Println(currentCon)
go currentCon.Routine(tcpConn)
default:
}
// ... handle active connections
}

这是我的 pollTcpConnections 例程:

func pollTcpConnections(listener net.Listener, rawConnections chan net.Conn) {
for {
conn, err := listener.Accept() // this blocks, afaik
if(err != nil) {
checkError(err)
}
fmt.Println("New connection")
rawConnections<-conn
}
}

问题是我从未收到这些连接。如果我以阻塞方式执行此操作,如下所示:

for {
tcpConn := <-rawConnections
// ...
}

我收到了连接,但它阻塞了...我也尝试缓冲 channel ,但同样的事情发生了。我在这里缺少什么?

最佳答案

根据现有代码很难说出为什么您看不到任何连接。您的示例的一个问题是您在 select 语句中有一个空的 default 案例,然后我们看不到此 for< 中还发生了什么 循环。按照您编写它的方式,该循环可能永远不会屈服于调度程序。你基本上是在说“从 channel 里拿东西。没有吗?好吧,重新开始。从 channel 里拿东西!”,但你从来没有真正等待过。当您执行某些阻止您的 goroutine 的操作时,该 goroutine 会屈服于调度程序。因此,当您以正常方式读取 channel 时,如果没有可读取的值,则该 goroutine 将被阻止读取。由于它被阻塞了,它也会屈服于调度程序以允许其他 goroutines 继续在底层线程上执行。我相当确定这就是为什么您的 select 和一个空的 default 被破坏的原因;你导致 goroutine 在 for 循环上无限循环,而不会屈服于调度程序。

目前还不清楚 pendingConnections 的作用是什么,或者是否需要它。

从行为中无法分辨的另一件事是您的 checkError 函数做了什么。例如,它不会继续到 for 循环或 bail 的顶部。

无论如何,看起来这比它需要的更复杂。只需要一个函数将新连接作为一个参数,然后在连接时在新的 goroutine 中启动它。我总是这样写:

func handleConnection(c net.Conn) {
// do something with your connection here.
}

for {
// Wait for a connection.
conn, err := l.Accept()
if err != nil {
// do something with your error. You probably want to break or return here.
break
}
// handle each connection in a new goroutine
go handleConnection(conn)
}

这或多或少正是他们在 the documentation 中所做的.

关于select - 从 Go channel 获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com