登录
首页 >  Golang >  Go问答

从文件读取数据并同时发送数据时出现数据竞争问题

来源:stackoverflow

时间:2024-04-27 23:27:34 424浏览 收藏

你在学习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)

理论要掌握,实操不能落!以上关于《从文件读取数据并同时发送数据时出现数据竞争问题》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

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