The code you posted above never actually called goToSleep(), because the 'strings ' channel was nil. Could you post a playground link to the new code that you are running below?
On Tuesday, February 25, 2020 at 8:38:27 PM UTC-5, Juan Mamani wrote: > > Ok, you are right. But I was confused with this: > > 2009/11/10 23:00:00 -----------------Start > 2009/11/10 23:00:00 Sleeping 8 seconds..2009/11/10 23:00:03 Canceling doWork > goroutine reach 3s...2009/11/10 23:00:08 Done sleeping! > 2009/11/10 23:00:08 doWork exited. > 2009/11/10 23:00:08 Done. > 2009/11/10 23:00:08 -----------------End > My previous questions were: How can I cancel execution ofv function? How can > I break it? Because I expect code to stop function gotoTosleep() at 3s, but > I saw still running at 8s because prints "Done sleeping!".. > > But Michael Levieux got the idea and repliedr:"You cannot terminate a > function execution from its caller.." . So I was wrong in my understanding > how to implement "cancel" or "break" goroutinea. > > > El martes, 25 de febrero de 2020, 13:45:03 (UTC-3), Jake Montgomery > escribió: >> >> Expected behaviour is to end anonyimous func when 3s timeout is >>> reached. >>> >> >> So what is the problem? The whole thing *does *exit after 3 seconds. Of >> course, your main() is a loop, so it starts again. >> >> 2009/11/10 23:00:00 -----------------Start >> 2009/11/10 23:00:03 Canceling doWork goroutine reach 3s... >> 2009/11/10 23:00:03 doWork exited. >> 2009/11/10 23:00:03 Done. >> 2009/11/10 23:00:03 -----------------End >> >> >> What exactly did you expect to see other than that? >> >> On Monday, February 24, 2020 at 6:45:26 PM UTC-5, Juan Mamani wrote: >>> >>> Sorry again. Well, I followed your advice. Here is the link >>> https://play.golang.org/p/7DigEVsKbdx >>> How can I cancel goToSleep() when timeout is reached? >>> >>> >>> El lunes, 24 de febrero de 2020, 14:16:32 (UTC-3), Jake Montgomery >>> escribió: >>>> >>>> Your code will still not compile. In this group, it is often helpful to >>>> include a link to your code in the playground (https://play.golang.org/) >>>> using the "Share" button. That is in addition to, or instead of, posting >>>> your code in the message. This will allow others to easily run your code, >>>> but also will allow you to make sure it compiles. >>>> >>>> On Monday, February 24, 2020 at 10:01:01 AM UTC-5, Juan Mamani wrote: >>>>> >>>>> Sorry}, here is the right code: ( just was the effect to b working >>>>> til At 5:20am sleepy and lost) >>>>> >>>>> Expected behaviour is to end anonyimous func when 3s timeout is >>>>> reached. >>>>> >>>>> //------------------------------------------------ >>>>> package main >>>>> >>>>> import( >>>>> //"fmt" >>>>> "time" >>>>> "math/rand" >>>>> "log" >>>>> ) >>>>> >>>>> func main(){ >>>>> >>>>> for{ >>>>> log.Println("-----------------Start") >>>>> Task() >>>>> log.Println("-----------------End") >>>>> >>>>> } >>>>> >>>>> } >>>>> >>>>> >>>>> // Trying to adapt from Concurrency in Go by Katherine Cox-Buday >>>>> func Task(){ >>>>> >>>>> doWork := func( done <-chan interface{}, strings <-chan string, ) >>>>> <-chan interface{} { //1 >>>>> terminated := make(chan interface{}) >>>>> go func() { >>>>> defer log.Println("doWork exited.") >>>>> defer close(terminated) >>>>> for { >>>>> goToSleep() >>>>> select { >>>>> //case s := <-strings: >>>>> // case s := ran(): >>>>> // Do something interesting >>>>> //fmt.Println(s) >>>>> case <-done: //2 >>>>> return >>>>> } >>>>> } >>>>> }() >>>>> return terminated >>>>> } >>>>> >>>>> done := make(chan interface{}) >>>>> terminated := doWork(done, nil) >>>>> >>>>> go func() { //3 >>>>> // Cancel the operation after 3 second. >>>>> time.Sleep(3 * time.Second) >>>>> log.Println("Canceling doWork goroutine reach 3s...") >>>>> close(done) >>>>> }() >>>>> >>>>> <-terminated //4 >>>>> log.Println("Done.") >>>>> } >>>>> >>>>> done := make(chan interface{}) >>>>> terminated := doWork(done, nil) >>>>> >>>>> go func() { //3 >>>>> // Cancel the operation after 3 second. >>>>> time.Sleep(3 * time.Second) >>>>> log.Println("Canceling doWork goroutine reach 3s...") >>>>> close(done) >>>>> }() >>>>> >>>>> <-terminated //4 >>>>> log.Println("Done.") >>>>> } >>>>> >>>>> >>>>> >>>>> func goToSleep(){ >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> rand.Seed(time.Now().UnixNano()) >>>>> n := rand.Intn(12) // n will be between 0 and 10 >>>>> log.Println("Sleeping ",n,"seconds..") >>>>> time.Sleep(time.Duration(n)*time.Second) >>>>> log.Println("Done sleeping!") >>>>> } >>>>> >>>>> //------------------------------------------------ >>>>> >>>>> >>>>> >>>>> El lunes, 24 de febrero de 2020, 6:09:09 (UTC-3), Lutz Horn escribió: >>>>>> >>>>>> > I've tried to adapt from from "Concurrency in Go by Katherine >>>>>> Cox-Buday" to >>>>>> > understand how to apply timeout. But I don't get it. >>>>>> >>>>>> What are you trying to do? What is the expected behaviour, what >>>>>> happens instead? >>>>>> >>>>>> BTW, this code does not compile, there are same unbalanced curly >>>>>> brackets. >>>>>> >>>>>> Lutz >>>>>> >>>>> -- 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/58cb2cda-0bd2-4a5e-897d-b46c1f96e224%40googlegroups.com.