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

标签 go channel subroutine

我有一个案例,我想启动一个 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/

相关文章:

vba - 如何知道调用了哪个子程序的程序?在excel vba中

perl - perl 如何从模块中导入子程序

go - #cgo LDFLAGS中的无效标志

go - 从父方法访问所有字段

go - 通过 channel 在 Go 中进行通信

django - 如何使用 channel websocket 在 Django 中找到 websocketbridge.js?

arrays - 为什么我的 Perl 循环最后关闭了 1?

templates - 如何使用特定键访问该结构映射中的结构字段值

go - 使用 gin 和 gorm 在 go lang 中对创建和更新操作使用相同的结构

去 channel 准备