【问题标题】:what's wrong with the golang code by using ticker使用ticker的golang代码有什么问题
【发布时间】:2017-06-28 03:12:09
【问题描述】:
package main

import (
    "fmt"
    "time"
)

func main() {
    intChan := make(chan int, 1)
    ticker := time.NewTicker(time.Second)
    go func() {
        for _ = range ticker.C {
            select {
            case intChan <- 1:
            case intChan <- 2:
            case intChan <- 3:
            }
        }
        /*defer */
        fmt.Println("End. [sender]")
    }()
    var sum int
    for e := range intChan {
        fmt.Printf("Received: %v\n", e)
        sum += e
        if sum > 10 {
            fmt.Printf("Got: %v\n", sum)
            break
            //ticker.Stop()
        }
    }
    fmt.Println("End. [receiver]")
    //time.Sleep(10)
}

我是 golang 的新手。在这段代码中,我想在 goroutine 结束时打印一次“End. [sender]”。 我尝试使用ticker.stop(),甚至time.sleep(),defer,但没有效果。 有什么问题,请给我一些想法。谢谢

【问题讨论】:

    标签: go channel ticker


    【解决方案1】:

    正如documentation 所说,ticker.Stop 不会关闭频道。所以你不能指望break-loop。您可以添加新的退出频道。

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        intChan := make(chan int, 2)
        ticker := time.NewTicker(time.Second)
        quit := make(chan bool)
        go func() {
        loop:
            for {
                select {
                case <-ticker.C:
                    select {
                    case intChan <- 1:
                    case intChan <- 2:
                    case intChan <- 3:
                    }
                case <-quit:
                    break loop
                }
            }
            /*defer */
            fmt.Println("End. [sender]")
            close(intChan)
        }()
        var sum int
        for e := range intChan {
            fmt.Printf("Received: %v\n", e)
            sum += e
            if sum > 10 {
                fmt.Printf("Got: %v\n", sum)
                quit <- true
                //break
                //ticker.Stop()
            }
        }
        fmt.Println("End. [receiver]")
        //time.Sleep(10)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多