Golang 并发读写文件问题啊啊啊啊

2018-02-06 19:53:32 +08:00
 Nebell

想着用 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()
1044 次点击
所在节点    Go 编程语言
2 条回复
goofool
2018-02-07 16:37:36 +08:00
可以参考 TCP 协议,每块加个 id,最后按 id 顺序写入
Nebell
2018-02-08 07:30:08 +08:00
用 channel 阻塞实现了😬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/429007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX