想着用 Go 写个 mmap + 并发读写文件的小程序,但是加了锁后输出顺序很有问题,俩文件都不一样.
求教怎么并发按顺序写出...
var mmFile, err = mmap.Open(filename)
var size, n = mmFile.Len() / 10, 0
var merr error
var Mutex sync.Mutex
var Wg sync.WaitGroup
var buf = make([]byte, size)
for i := 0; i < mmFile.Len() && io.EOF != merr; i += len(buf) {
Wg.Add(1)
go func(off int64) {
n, merr = mmFile.ReadAt(buf, off)
Mutex.Lock()
defer Mutex.Unlock()
if merr != nil {
log.Println(merr)
}
wFile.Write(buf[:n])
buf = make([]byte, size)
Wg.Done()
}(int64(i))
}
Wg.Wait()
1
goofool 2018-02-07 16:37:36 +08:00
可以参考 TCP 协议,每块加个 id,最后按 id 顺序写入
|
2
Nebell OP 用 channel 阻塞实现了😬
|