作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
func (s *server) send(m *message) error {
go func() {
s.outgoingMessageChan <- message
}()
return nil
}
func main(s *server) {
for {
select {
case <-someChannel:
// do something
case msg := <-s.outGoingMessageChan:
// take message sent from "send" and do something
}
}
}
我在另一个函数中退出了这个
s.outgoingMessageChan
,在使用匿名go函数之前,通常会阻止对该函数的调用-这意味着,每当调用
send
时,
s.outgoingMessageChan <- message
就会阻止,直到有东西退出。但是,在像这样包装之后,它似乎不再阻塞了。我知道它会将这种操作发送到后台并照常进行,但是我无法确定这不会影响当前函数调用。
最佳答案
每次调用send
时,都会创建一个新的goroutine,并立即返回。 (顺便说一句,如果永远都不会发生错误,则没有理由返回错误。)如果没有任何东西可以从chan
中读取(假设它没有缓冲),则goroutine(具有自己的执行“线程”)将阻塞。一旦从chan
中读取了消息,goroutine将继续执行,但是由于它什么也不做,它将简单地结束。
我应该指出,没有像匿名goroutine这样的东西。 Goroutine根本没有标识符(除了只能用于调试目的的数字)。您有一个匿名函数,将go
关键字放在前面,使它在单独的goroutine中运行。
对于发送函数,它可以按照您的意愿进行阻止,则只需使用:
func (s *server) send(m *message) {
s.outgoingMessageChan <- message
}
但是,我看不到此函数的任何要点(尽管它是内联的,并且与不使用函数一样有效)。
send
。在这种情况下,将创建许多新的goroutine(每次调用
send
),这些例程将全部阻塞。每次从chan中读取chan都会取消阻止传递其值,并且goroutine将终止。这样做只是在创建效率低下的缓冲机制。而且,如果以比从chan读取值更快的速率长时间调用
send
,那么最终将耗尽内存。最好使用一个缓冲 channel (不使用goroutine),一旦该 channel ( channel )变满,它将对产生消息的任何对象施加“背压”。
main
用于标识程序的入口点。请为上面的第二个功能使用其他名称。似乎也应该是方法(使用
s *server
接收器)而不是函数。
关于go - 匿名函数中的该例程如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64092460/
我是一名优秀的程序员,十分优秀!