gpt4 book ai didi

go - 如何让多个对象从一个go子程序中获取数据

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

我有一个案例,我想启动一个 go 子例程,它会定期从源中获取一些数据。如果调用失败,它将存储错误直到下一次调用成功。现在代码中有几个实例,其中一个实例将访问由 go 子例程提取的数据。我怎样才能实现类似的东西?

更新

我睡了一觉,喝了咖啡,我想我需要使用 java 风格的语义更连贯地重新表述这个问题。

我想出了一个基本的单例模式,它返回一个接口(interface)实现,它在一个永远循环的内部运行一个 go 子例程(让我们暂时搁置永远循环的主要错误)。问题是这个接口(interface)实现正被多个线程访问,以获取 go 子例程收集的数据。本质上,子程序每 10 分钟提取一次数据,然后无限次地请求数据。我怎样才能实现类似的东西?

最佳答案

这是一个非常基本的示例,说明如何定期获取和收集数据。

请记住:运行此代码不会执行任何操作,因为 main 会在真正发生任何事情之前返回,但是您如何处理它取决于您的具体用例。这段代码真的很简单,需要改进。这是部分问题的可能解决方案的草图:)

我没有在这里处理错误,但您可以像处理获取的数据一样处理它们(因此,多一个错误 channel 和一个从中读取的 goroutine)。

func main() {

period := time.Second
respChan := make(chan string)
cancelChan := make(chan struct{})
dataCollection := []string

// periodicaly fetch data and send it to respChan
go func(period time.Duration, respChan chan string, cancelChan chan struct{}) {
ticker := time.Ticker(period)
for {
select {
case <-ticker.C:
go fetchData(respChan)
case <-cancelChan:
// close respChan to stop reading goroutine
close(respChan)
return
}
}
}(period, cancelChan)

// read from respChan and write to dataCollection
go func(respChan chan string) {
for data := range respChan {
dataCollection = append(dataCollection, data)
}
}(respChan)

// close cancelChan to gracefuly stop the app
// close(cancelChan)
}


func fetchData(respChan chan string) {
data := "fetched data"
respChan <- data
}

关于go - 如何让多个对象从一个go子程序中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49166563/

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