登录
首页 >  Golang >  Go问答

Go 中的缓冲通道

来源:stackoverflow

时间:2024-04-08 13:18:31 468浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Go 中的缓冲通道》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在开发一个使用树莓派和arduino的项目。我正在树莓派上编写一个 go 程序,以每秒 115200 波特率从 arduino 接收 uart 数据。树莓派读取uart数据,将其保存到文件(基于file1file2等的值),然后将文件发送到ftp服务器。

由于上传到服务器可能需要时间,具体取决于网络,我想使用 go 并发,以便 uart 读取和保存到文件不会中断。以下是我尝试应用的伪代码(骨架)。我在代码中的想法是文件路径将按顺序缓冲在通道中,并且上传以相同的顺序执行。我做得正确吗?有没有更好的方法来解决这个问题?

package main

import "strings"

func SendFile(filePath string) {

}
// based on the value of the data, SaveToFile saves the data to either file1, file2 or file3
func SaveToFile(uartData []string) filePath string {

    return filePath
}

func main() {


    ch := make(chan string, 1000)

    //uartInit initialization goes here
    uart := uartInit()

    //infinite loop for reading UART...
    for {
        buf := 1024 // UART buffer
        data := uart.Read(buf)
        uartData = strings.Split(string(buf), " ")

        //channel receives filepath 
        ch <- SaveToFile(uartData)

        //channel sends filepath
        go SendFile(<-ch)

    }
}

解决方案


您正在向通道写入一个字符串,然后将其读回。 sendfile() 在不同的 goroutine 中运行,但您使用它的方式不需要通道。你可以简单地做

fname:= SaveToFile(uartData)
 go SendFile(fname)

但是,我认为这不是您想要做的。

相反,您应该有一个 goroutine,在其中从 uart 读取数据,然后写入缓冲通道。监听该通道的是另一个将数据块写入文件的 goroutine。当准备好发送时,创建第三个 goroutine 来发送文件。

今天关于《Go 中的缓冲通道》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>