我在golang中理解频道时遇到了一些麻烦。据我所知,通道是以给定时间间隔将数据发布到控制台的正确方法。
所以说我有一个正在做工作的goroutine,然后在我的主循环中我想每秒从该goroutine打印数据。
这样的事情怎么编码?一个简单的例子将不胜感激。
答案 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)
}
}
但这并不是你所要求的,你想要每一秒的常规状态。为此,渠道不是一个好的解决方案。两个例程之间共享的变量将解决问题。一个例程更新它,另一个例程每秒读取它。