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。