【问题标题】:What are the possible usecases of empty select{}空 select{} 的可能用例有哪些
【发布时间】:2021-08-01 15:40:43
【问题描述】:

我知道空的 select{} 会永远阻塞 go-Routine,但不明白这可以满足所有不同的用例吗?

我还检查了去 repo 以找到更多用法,我只能找到两个实现,一个在 syscall/js,另一个在 httptest

func handleEvent() {
        cb := jsGo.Get("_pendingEvent")
        if cb.IsNull() {
                return
        }
        jsGo.Set("_pendingEvent", Null())

        id := uint32(cb.Get("id").Int())
        if id == 0 { // zero indicates deadlock
                select {}
        }
        funcsMu.Lock()
        f, ok := funcs[id]
        funcsMu.Unlock()
        if !ok {
                Global().Get("console").Call("error", "call to released function")
                return
        }

        this := cb.Get("this")
        argsObj := cb.Get("args")
        args := make([]Value, argsObj.Length())
        for i := range args {
                args[i] = argsObj.Index(i)
        }
        result := f(this, args)
        cb.Set("result", result)
}

在httptest中的使用

// Start starts a server from NewUnstartedServer.
func (s *Server) Start() {
        if s.URL != "" {
                panic("Server already started")
        }
        if s.client == nil {
                s.client = &http.Client{Transport: &http.Transport{}}
        }
        s.URL = "http://" + s.Listener.Addr().String()
        s.wrap()
        s.goServe()
        if serveFlag != "" {
                fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
                select {}
        }
}

这里的问题是这里如何使用select {},如果有除此之外的任何其他用例,我们可以在哪里利用select {}

【问题讨论】:

  • <-make(chan bool)更简洁

标签: go concurrency blocking goroutine


【解决方案1】:

select {} 永远阻塞当前的 goroutine。

一个用例是当你需要这样做时,很明显。这应该是极其罕见的情况。

第一个示例使用它来强制主 goroutine 中的死锁,因为 eventID 0 是不可能的。

但第二个例子是代码异味。 你几乎总是可以用一种不需要阻塞这样的 goroutine 的方式来构造代码。比如s.goServe()可以重构为s.serve(),那么就可以阻塞或者非阻塞的方式调用,分别使用s.serve()或者go s.serve()

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 2016-07-17
    • 2015-10-23
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    相关资源
    最近更新 更多