每次请求进来时,我都会不时地向一个文件写入一些数据。我还想解析这个文件并有时读取它。如果不断写入文件,我该怎么读?模式是什么?
答案 0 :(得分:4)
您可以使用sync.RWMutex
。然后:
<test name="Order" preserve-order="true" enabled="true">
<classes>
<class name="com.sw.testcases.EcommCreate1" />
<class name="com.sw.testcases.BoCreate1" />
</classes>
</test>
,阅读,然后致电RLock()
。RUnlock()
,写信,然后拨打Lock()
。只要您这样做,就可以确保:
这是一个很小的例子:
Unlock()
答案 1 :(得分:0)
所以你想要阅读&amp;写文件而不锁定,
Stateful Goroutines和渠道是解决方案:
一个Stateful Goroutine管理读写请求
工作示例代码:
package main
import "os"
import "fmt"
import "sync"
type Buffer struct {
buf []byte
off int64
}
var wg sync.WaitGroup
func main() {
wr := make(chan *Buffer)
rq := make(chan *Buffer)
rd := make(chan *Buffer)
wg.Add(1)
go manage("file.bin", wr, rq, rd)
wr <- &Buffer{buf: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, off: 0} //write
wr <- &Buffer{buf: []byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, off: 10} //write
rq <- &Buffer{buf: make([]byte, 20), off: 0} //request to read
b := <-rd //read
fmt.Println("read:", b)
//read: &{[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] 0}
rq <- &Buffer{buf: nil, off: -1} // exit
wg.Wait()
fmt.Println("Bye") //Bye
}
func manage(filename string, wr, rq, rd chan *Buffer) {
f, e := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
if e != nil {
panic(e.Error())
}
defer f.Close()
for {
select {
case b := <-wr:
f.WriteAt(b.buf, b.off)
default:
}
select {
case b := <-rq:
if b.off == -1 {
wg.Done()
return
}
n, _ := f.ReadAt(b.buf, b.off)
rd <- &Buffer{b.buf[1:n], b.off}
default:
}
}
}