Leaving aside the channel being non-nil, none of the others are a clear way to solve this. They all involve either repeatedly checking on a timer or checking the value of another field (like polling) to see whether the long running task should be stopped.
Is there no other way to do this then? On Friday, 16 March 2018 20:34:38 UTC+5:30, matthe...@gmail.com wrote: > > While this is running, your select won't be receiving on the quit >> channel, even if it is non-nil. >> If you want to be able to cancel it, you'll need to make the code in >> the loop responsive to the quit channel >> (for example, by using a select like you're using in f already). > > > The default select case does it: https://play.golang.org/p/jlfaXu6TZ8L > > Here's another way: https://play.golang.org/p/gEDef3LolAZ > > Matt > > On Friday, March 16, 2018 at 9:45:00 AM UTC-5, Sathish VJ wrote: >> >> All the examples I've seen use some kind of ticker to run various cases >> of a select statement. But how does one run a long running task that is >> still cancelable? >> >> >> In the example below the quit part is never reached. >> >> https://play.golang.org/p/PLGwrUvKaqn (it does not run properly on >> play.golang.org). >> >> package main >> >> >> import ( >> "fmt" >> "os" >> "time" >> ) >> >> >> func f(quit chan bool) { >> for { >> select { >> case <-time.After(0 * time.Second): >> // start long running task immediately. >> for { >> time.Sleep(500 * time.Millisecond) >> fmt.Printf(". ") >> } >> case <-quit: >> fmt.Println("quit called") >> //deallocate resources in other long running task and then return >> from function. >> os.Exit(0) // or return >> } >> } >> } >> >> >> func main() { >> var quit chan bool >> go f(quit) >> >> >> println("quit sending ... ") >> quit <- true >> println("after quit sent") >> >> >> var i chan int >> <-i >> } >> >> >> -- 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. For more options, visit https://groups.google.com/d/optout.