Go 锁定文件以便读取

Go 锁定文件以便读取,go,Go,我尝试从另一个进程读取Lock()文件,所以我尝试用下一种方法执行此操作: var ( mutex = sync.Mutex{} ) func main() { fmt.Println("Start") go runZiper() mutex.Lock() defer mutex.Unlock() f2, _ := os.Open("test_tmp.txt") // here will be writing to file t

我尝试从另一个进程读取
Lock()
文件,所以我尝试用下一种方法执行此操作:

var (
    mutex = sync.Mutex{}
)

func main() {
    fmt.Println("Start")
    go runZiper()

    mutex.Lock()
    defer mutex.Unlock()
    f2, _ := os.Open("test_tmp.txt")
    // here will be writing to file
    time.Sleep(3 * time.Second) //just for try
    f2.Close()

}

func runZiper() { // this process will compress file (files) in some period
    time.Sleep(1 * time.Second) //just for try
    f, err := os.Create("test_tmp.txt.zip")
    if err != nil { ... }
    defer f.Close()
    w := zip.NewWriter(f)
    data, err := ioutil.ReadFile("test_tmp.txt")
    if err != nil { ... }
    fz, _ := w.Create("zipped.txt")
    fz.Write(data)
    w.Close()
}
但是我的
压缩程序
(函数
runZip
)仍然可以读取和压缩打开的文件。这样我就可以丢失信息

我怎样才能避免这种情况


我曾尝试使用
sync.Mutex
sync.RWMutex
,但结果是一样的。

我认为有一种聪明的方法可以解决这个问题。关闭此文件时,可以更改此文件的名称。另一方面,我们使用压缩器读取另一个名称,如test_tmp1.txt

func main() {
    go runZiper()
    f2, _ := os.Open("test_tmp.txt")
    // here will be writing to file
    time.Sleep(3 * time.Second) //just for try
    f2.Close()
    err := os.Rename("test_tmp.txt", "test_tmp1.txt")
    if err != nil {
        fmt.Println(err)
    }
}

func runZiper() { // this process will compress file (files) in some period
    time.Sleep(1 * time.Second) //just for try
    f, err := os.Create("test_tmp.txt.zip")
    if err != nil {
        fmt.Println("test_tmp.txt.zip")
   }
   defer f.Close()
   w := zip.NewWriter(f)
   data, err := ioutil.ReadFile("test_tmp1.txt")
   if err != nil {
       fmt.Println("failed")
   }
   fz, _ := w.Create("zipped.txt")
   fz.Write(data)
   w.Close()
}

什么是压缩机?我在你的代码中看不到这一点。你的问题不完整。我们无法告诉您如何修复我们看不到的内容。您是否有这样的印象,即互斥体会以某种方式影响其他进程?事实并非如此。互斥体用于同步goroutine。