Thanks rog! I already dealt with it in my project since the Listen of gorilla websocket did as you just mentioned - close and even throw out an error. But I am surprised at why golang still has not provided a general feature on that.
Zhaoxun On Sat, Apr 16, 2022 at 10:14 PM roger peppe <rogpe...@gmail.com> wrote: > Most network functions provide a way to provide a timeout or cancellation > explicitly. Listen is one such: see this method - if the context that it's > passed is cancelled, the Listen call will return. > https://pkg.go.dev/net#ListenConfig.Listen > > The most general way to stop waiting on timeout or cancellation in the > absence of explicitly provided functionality is to start the function in a > separate goroutine and send notification when the function completes. This > is non-ideal because the goroutine will remain around even when the waiter > has given up, but can still be a useful technique in some circumstances. > > Hope this helps, > rog. > > On Sat, 16 Apr 2022, 14:30 Zhaoxun Yan, <yan.zhao...@gmail.com> wrote: > >> Timeout is quite common practice in programming. For example, Listen >> function in internet connection with a timeout may just close the >> connection and Listen thread as silence persists for some period, like 60 >> seconds. >> >> I found it very hard to implement such a general shutdown feature of a >> thread/goroutine on such I/O functions, here is one unsuccessful try, which >> I want to stop the whole in 9 seconds but it does not function as I wanted: >> >> package main >> >> import ( >> "fmt" >> "time" >> ) >> >> func wait(){ >> time.Sleep(5 * time.Second) >> fmt.Println("wait 1st signal") >> time.Sleep(5 * time.Second) >> fmt.Println("wait 2nd signal") >> } >> >> >> func main() { >> ticker := time.NewTicker(3 * time.Second) >> i := 0 >> for{ >> select{ >> case <- ticker.C: >> i++ >> fmt.Printf("ticker rings %d\n", i) >> if i==3{ >> return >> } >> default: >> wait() >> } >> } >> >> } >> >> The result is to wait whole 30 seconds: >> wait 1st signal >> wait 2nd signal >> ticker rings 1 >> wait 1st signal >> wait 2nd signal >> ticker rings 2 >> wait 1st signal >> wait 2nd signal >> ticker rings 3 >> >> An online course suggests to wrap up the wait/Listen function with a >> channel (which would return something instead of nothing above) >> >> go func(){ >> resultChan <- Listen() >> }() >> >> select{ >> case a := <- resultChan: >> //analyze a >> case <-ticker.C: >> //might break or return >> } >> >> But this recipe obviously only kill the select goroutine rather than the >> anonymous goroutine that actually runs Listen function. My question is - >> how to kill the waiting or listening goroutine from outside? >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/e774c5a4-ed53-43da-a1fe-0d617603e223n%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/e774c5a4-ed53-43da-a1fe-0d617603e223n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CADEX6_WAwhVnFmEavAThJ5uQN%3DjVK0uuh2pFSxt%3DczjgLFbNPA%40mail.gmail.com.