如果http.SERVICE阻塞,如何将其放置在自己的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

调用时立即返回错误,如果成功执行,则阻塞

我怎样才能使它在自己的goroutine中阻止它呢?我目前拥有以下代码:

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
的调用者监听频道。