golang:如何以固定的间隔打印运行goroutine的数据?

时间:2013-11-15 20:00:58

标签: go

我在golang中理解频道时遇到了一些麻烦。据我所知,通道是以给定时间间隔将数据发布到控制台的正确方法。

所以说我有一个正在做工作的goroutine,然后在我的主循环中我想每秒从该goroutine打印数据。

这样的事情怎么编码?一个简单的例子将不胜感激。

2 个答案:

答案 0 :(得分:7)

您可以在内存中拥有一些受保护的共享状态,您可以从长时间运行的进程中进行更新。然后你有一个计时器,每秒都会触发这个共享状态检查。 这是一个简单的例子:http://play.golang.org/p/gfGvhHUWIc

代码:

package main

import (
    "fmt"
    "sync"
    "time"
)

type Progress struct {
    current string
    rwlock  sync.RWMutex
}

func (p *Progress) Set(value string) {
    p.rwlock.Lock()
    defer p.rwlock.Unlock()
    p.current = value
}

func (p *Progress) Get() string {
    p.rwlock.RLock()
    defer p.rwlock.RUnlock()
    return p.current
}

func longJob(progress *Progress) {
    i := 0
    for {
        time.Sleep(100 * time.Millisecond)
        i++
        progress.Set(fmt.Sprintf("Current progress message: %v", i))
    }
}

func main() {
    fmt.Println("test")
    c := time.Tick(1 * time.Second)
    progress := &Progress{}
    go longJob(progress)
    for {
        select {
        case <-c:
            fmt.Println(progress.Get())
        }
    }
}

答案 1 :(得分:1)

如果您想将数据从一个例程传递到另一个例程,您可以这样做

package main

import "fmt"

func routine(output chan int) {
    for i := 0; i < 1000; i++ {
        output <- i
    }
    close(output)
}

func main() {
    ch := make(chan int)
    go routine(ch)
    for i := range ch {
        fmt.Printf("%d ", i)
    }
}

但这并不是你所要求的,你想要每一秒的常规状态。为此,渠道不是一个好的解决方案。两个例程之间共享的变量将解决问题。一个例程更新它,另一个例程每秒读取它。