Skip to content

Instantly share code, notes, and snippets.

@dlintw
Created April 22, 2013 09:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dlintw/5433405 to your computer and use it in GitHub Desktop.
Save dlintw/5433405 to your computer and use it in GitHub Desktop.
multi file read example code
package main
import (
"bufio"
"flag"
"fmt"
"time"
"log"
"io"
"os"
"path"
)
type data_t struct {
Buf []byte
N int
}
func usage() {
_, exeName := path.Split(os.Args[0])
fmt.Fprintf(os.Stderr, `Usage: %s <input_files>`, exeName)
flag.PrintDefaults()
}
func Reader(fname string, chQuit chan bool, out chan data_t) error {
fmt.Println("Reader for", fname)
f, err := os.Open(fname)
if err != nil {
log.Fatalln(err)
}
defer f.Close()
r := bufio.NewReader(f)
prevReadTime := time.Now()
F:
for {
select {
case <-chQuit:
break F
default:
var v data_t
v.Buf = make([]byte,1024)
readTime := time.Now()
v.N, err = r.Read(v.Buf)
if err != nil && err != io.EOF {
log.Fatalln(err)
}
if readTime.Sub(prevReadTime) < 3 * time.Second {
if v.N == 0 {
time.Sleep(1000 * time.Millisecond) // 0.5 s
} else {
prevReadTime = readTime
fmt.Println(fname, "read", v.N, "bytes")
out <- v
}
} else {
fmt.Println("Timeout for 3 seconds", readTime.Sub(prevReadTime))
break F
}
}
}
return nil
}
func main() {
log.SetFlags(log.Lshortfile)
flag.Usage = usage
flag.Parse()
if flag.NArg() == 0 {
usage()
os.Exit(1)
}
chData := make(chan data_t)
nLen := int(flag.NArg())
chQuit := make([]chan bool, nLen)
for i, fname := range flag.Args() {
go Reader(fname, chQuit[i], chData)
}
const timeoutNs = 20e9
F:
for {
select {
case data := <-chData:
fmt.Println("data=", data.Buf[:data.N])
case <-time.After(timeoutNs):
fmt.Println("Timeout")
break F
}
}
// Bug here, will cause all thread sleeping
for i := range flag.Args() {
chQuit[i] <- true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment