V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Nebell
V2EX  ›  Go 编程语言

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

  •  
  •   Nebell · 2018-02-06 19:53:32 +08:00 · 1058 次点击
    这是一个创建于 2489 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想着用 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()
    
    goofool
        1
    goofool  
       2018-02-07 16:37:36 +08:00
    可以参考 TCP 协议,每块加个 id,最后按 id 顺序写入
    Nebell
        2
    Nebell  
    OP
       2018-02-08 07:30:08 +08:00 via Android
    用 channel 阻塞实现了😬
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2703 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:53 · PVG 19:53 · LAX 03:53 · JFK 06:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.