gpt4 book ai didi

go - 如何始终从 Go channel 获取最新值?

转载 作者:数据小太阳 更新时间:2023-10-29 03:30:05 26 4
gpt4 key购买 nike

我从 Go 开始,现在我正在编写一个简单的程序,它从传感器读取数据并将其放入 channel 中以使用它进行一些计算。我现在让它工作如下:

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"
}
}

这很好用,但传感器会生成大量数据,而我总是只对最新数据感兴趣。然而,使用此设置,它只会在每个循环中读出下一个项目,这意味着如果某个点的 channel 包含 20 个值,则只会在 10 秒后读出最新值。

有没有办法让一个channel一次总是只包含一个值,这样我总是只得到我感兴趣的数据,而channel不会占用不必要的内存(虽然内存是最少的我的担忧)?

最佳答案

最好将 channel 视为队列 (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
}

这使用了一个RWMutex,这意味着许多东西可以同时从它读取而只有一个东西可以写入。它将像您所说的那样存储一个条目。

关于go - 如何始终从 Go channel 获取最新值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53770746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com