我从Go开始,现在正在编写一个简单的程序,该程序从传感器中读取数据,并将其放入通道中进行一些计算。我现在有如下工作:
package main
import (
"fmt"
"time"
"strconv"
)
func get_sensor_data(c chan float64) {
time.Sleep(1 * time.Second) // wait a second before sensor data starts pooring in
c <- 2.1 // Sensor data starts being generated
c <- 2.2
c <- 2.3
c <- 2.4
c <- 2.5
}
func main() {
s := 1.1
c := make(chan float64)
go get_sensor_data(c)
for {
select {
case s = <-c:
fmt.Println("the next value of s from the channel: " + strconv.FormatFloat(s, 'f', 1, 64))
default:
// no new values in the channel
}
fmt.Println(s)
time.Sleep(500 * time.Millisecond) // Do heavy "work"
}
}
这可以正常工作,但传感器会生成大量数据,而我始终只对最新数据感兴趣。但是,通过这种设置,它只会在每个循环中读出下一个项目,这意味着如果某个点的通道包含20个值,则仅在10秒后才读出最新值。
是否有一种方法可以使通道一次始终只包含一个值,所以我总是只获取自己感兴趣的数据,并且该通道不使用不必要的内存(尽管内存是我最少的担心) )?
欢迎所有提示!
最好将通道视为队列(FIFO)。因此,您不能真正跳过。但是,那里有一些库可以执行以下操作:https : //github.com/cloudfoundry/go-diodes是一个原子环形缓冲区,它将覆盖旧数据。您可以根据需要设置较小的尺寸。
话虽这么说,听起来好像您不需要队列(或环形缓冲区)。您只需要一个互斥锁:
type SensorData struct{
mu sync.RWMutex
last float64
}
func (d *SensorData) Store(data float64) {
mu.Lock()
defer mu.Unlock()
d.last = data
}
func (d *SensorData) Get() float64 {
mu.RLock()
defer mu.RUnlock()
return d.last
}
使用a RWMutex
表示可以同时读取许多内容,而只能写入单个内容。它将像您说的那样存储单个条目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句