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

net*_*ain 7 go

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

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

这样的事情怎么编码?一个简单的例子将非常感激.

Klu*_*uyg 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())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,`sync.RWMutex` 作为匿名成员看起来更好,所以你可以只做 `p.Lock()` 而不是 `p.rwlock.Lock()`:例如 http://play.golang.org/p /2ewAmCCaVu (2认同)