In go, how can I control parallel writing to a text file?
I am asking about this because I will have several goroutines writing to a text file using the same file handler.
I wrote this bit of code to try to see what happens, but I'm not sure that I did this “correctly”:
package main
import (
"os"
"sync"
"fmt"
"time"
"math/rand"
"math"
)
func WriteToFile( i int, f *os.File, w *sync.WaitGroup ){
randSleep := int( math.Floor( 200 + ( 2 * rand.Float64() ) ) )
fmt.Printf( "Thread %d waiting %d\n", i, randSleep )
time.Sleep( time.Duration(randSleep) * time.Millisecond )
fmt.Fprintf( f, "Printing out: %d\n", i )
fmt.Printf( "Printing out: %d\n", i )
w.Done()
}
func main() {
rand.Seed( time.Now().UnixNano() )
d, err := os.Getwd()
if err != nil {
fmt.Println( err )
}
filename := d + "/log.txt"
f, err := os.OpenFile( filename, os.O_CREATE | os.O_WRONLY | os.O_TRUNC, 0666 )
if err != nil {
fmt.Println( err )
}
var w *sync.WaitGroup = new(sync.WaitGroup)
w.Add( 10 )
for i:=1; i <= 10; i++ {
go WriteToFile( i, f, w )
}
w.Wait()
}
I expected the output to show something like this in the file instead of the resulting coherent output:
Printing Printing out: 2
out: 5
Poriuntitng: 6
Essentially, I expected the characters to come out incoherently and intertwined due to lack of synchronization. Didn't I write code to convince this behavior? Or is there some kind of mechanism during fmt.Fprintfwrite synchronization calls ?
source
share