当前位置: > > > > 从文件读取数据并同时发送数据时出现数据竞争问题
来源:stackoverflow
2024-04-27 23:27:34
0浏览
收藏
你在学习Golang相关的知识吗?本文《从文件读取数据并同时发送数据时出现数据竞争问题》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
问题内容
我正在尝试从文件中读取数据并立即将读取的块发送给它,而无需等待其他 goroutine 完成文件读取。我有两个功能
func readfile(stream chan []byte, stop chan bool) { file.lock() defer file.unlock() dir, _ := os.getwd() file, _ := os.open(dir + "/somefile.json") chunk := make([]byte, 512*4) for { bytesread, err := file.read(chunk) if err == io.eof { break } if err != nil { panic(err) break } stream <- chunk[:bytesread] } stop <- true }
第一个负责读取文件并将数据块发送到从其他函数接收的“流”通道
func SteamFile() { stream := make(chan []byte) stop := make(chan bool) go ReadFile(stream, stop) L: for { select { case data := <-stream: //want to send data chunk by socket here fmt.Println(data) case <-stop: break L } } }
第二个函数创建 2 个通道,将它们发送到第一个函数并开始监听通道。 问题是有时 data := <-stream
丢失。例如,我没有收到文件的第一部分,但收到了所有其他部分。当我使用 -race 标志运行程序时,它表明存在数据竞争,并且两个 goroutine 同时写入通道和从通道读取。说实话,我认为这是使用渠道的正常方式,但现在我发现它带来了更多问题。 有人可以帮我解决这个问题吗?
解决方案
当我使用 -race 标志运行程序时,它表明存在数据竞争,并且两个 goroutine 同时写入通道和从通道读取。说实话,我认为这是使用渠道的正常方式。
确实如此,而且您几乎肯定误解了竞争检测器的输出。
您正在 readfile 中共享切片(因此它是底层数组),因此当在 steamfile 中读取数据时,数据会被覆盖在 readfile 中 [原文如此]。虽然这不应该触发竞争检测器,但这绝对是一个错误。为每个 read 调用创建一个新切片:
func ReadFile(stream chan []byte, stop chan bool) { file.Lock() defer file.Unlock() dir, _ := os.Getwd() file, _ := os.Open(dir + "/someFile.json") - chunk := make([]byte, 512*4) for { + chunk := make([]byte, 512*4) bytesRead, err := file.Read(chunk)
理论要掌握,实操不能落!以上关于《从文件读取数据并同时发送数据时出现数据竞争问题》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注公众号吧!