如果http.SERVICE阻塞,如何将其放置在自己的goroutine中?
调用时立即返回错误,如果成功执行,则阻塞 我怎样才能使它在自己的goroutine中阻止它呢?我目前拥有以下代码:如果http.SERVICE阻塞,如何将其放置在自己的goroutine中?,go,concurrency,Go,Concurrency,调用时立即返回错误,如果成功执行,则阻塞 我怎样才能使它在自己的goroutine中阻止它呢?我目前拥有以下代码: func serveOrErr(l net.Listener, handler http.Handler) error { starting := make(chan struct{}) serveErr := make(chan error) go func() { starting <- struct{}{} if
func serveOrErr(l net.Listener, handler http.Handler) error {
starting := make(chan struct{})
serveErr := make(chan error)
go func() {
starting <- struct{}{}
if err := http.Serve(l, handler); err != nil {
serveErr <- err
}
}()
<-starting
select {
case err := <-serveErr:
return err
default:
return nil
}
}
func serveorer(l net.Listener,handler http.handler)错误{
起始:=make(chan结构{})
serveErr:=制造(更改错误)
go func(){
启动时,可以在select语句上使用超时,例如
timeout := time.After(5 * time.Millisecond) // TODO: ajust the value
select {
case err := <-serveErr:
return err
case _ := <- timeout:
return nil
}
timeout:=time.After(5*time.毫秒)//TODO:A调整值
挑选{
case err:=您可以在select语句上使用超时,例如
timeout := time.After(5 * time.Millisecond) // TODO: ajust the value
select {
case err := <-serveErr:
return err
case _ := <- timeout:
return nil
}
timeout:=time.After(5*time.毫秒)//TODO:A调整值
挑选{
案例错误:=
Serve要么在调用时立即返回错误,要么在成功执行时阻塞
这种假设是不正确的。我相信这种情况很少发生。在循环中调用net.Listener.Accept
–任何时候都可能发生错误(套接字关闭,打开的文件描述符太多等等)。它是http.ListenAndServe
,通常用于运行http服务器,绑定侦听套接字时通常会提前失败(没有权限,地址已在使用中)
在我看来,你试图做的是错误的,除非你的net.Listener.Accept因某种原因在第一次调用时失败。是吗?如果你想100%确保你的服务器正常工作,你可以尝试连接到它(可能真的传输一些东西),但一旦您成功绑定套接字,我认为这并不是真正必要的
Serve要么在调用时立即返回错误,要么在成功执行时阻塞
这种假设是不正确的。我相信这种情况很少发生。在循环中调用net.Listener.Accept
–任何时候都可能发生错误(套接字关闭,打开的文件描述符太多等等)。它是http.ListenAndServe
,通常用于运行http服务器,绑定侦听套接字时通常会提前失败(没有权限,地址已在使用中)
在我看来,你试图做的是错误的,除非你的net.Listener.Accept因某种原因在第一次调用时失败。是吗?如果你想100%确保你的服务器正常工作,你可以尝试连接到它(可能真的传输一些东西),但是一旦你成功绑定了套接字,我就不觉得有必要了。谢谢你的洞察力。我现在做的是错误的。我原以为net.Listener.Accept
是第一次使用时返回绑定错误的函数,但事实上net.Listen
是罪魁祸首,它让事情变得简单多了。目前我将继续如果http.service
通过net.Listener.Accept
产生错误,请不要惊慌。如果我发现此错误路径很频繁,那么我可以使用通道将错误传递给函数serveOnError
的调用者,并让函数serveOnError
的调用者在通道上侦听。感谢您的洞察力。我所做的是错误的。我认为net.Listener.Accept
wa它是第一次使用时返回绑定错误的函数,但事实上,net.Listen
是罪魁祸首,它使事情变得更容易。目前,如果http.service
通过net.Listener.Accept
生成错误,我会感到恐慌。如果我发现此错误路径很频繁,那么我可以使用通道将错误传递给d让函数serveOnErr
的调用者监听频道。