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.

Reply via email to