Skip to content

Instantly share code, notes, and snippets.

@fwip
Created June 29, 2018 22:54
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 fwip/cd1e9fe552801c1f171c2154bb44bdd4 to your computer and use it in GitHub Desktop.
Save fwip/cd1e9fe552801c1f171c2154bb44bdd4 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"os"
)
const numWorkers = 10
func parseLine(s []string) int {
return len(s)
}
func makeWorker() (input chan []string, output chan int) {
input = make(chan []string)
output = make(chan int)
// Set up a worker process
go func() {
for line := range input {
output <- parseLine(line)
}
close(output)
}()
return input, output
}
func main() {
fmt.Println("vim-go")
file, err := os.Open("far-poston.csv")
if err != nil {
log.Fatal(err)
}
// Create numWorkers workers
var inputs []chan []string
var outputs []chan int
for x := 0; x < numWorkers; x++ {
input, output := makeWorker()
inputs = append(inputs, input)
outputs = append(outputs, output)
}
// Create a reader in a new goroutine
go func() {
r := csv.NewReader(file)
i := 0
for {
record, err := r.Read()
i++
if err == io.EOF {
break
} else if err != nil {
return
}
// Distribute records to workers in order
inputs[i%numWorkers] <- record
}
// Close out all inputs, so workers know to shutdown
for _, input := range inputs {
close(input)
}
}()
var alloutput []int
j := 0
for {
// Read results from outputs in order
o, ok := <-outputs[j%numWorkers]
j++
// If we run into a closed channel, we're done
if !ok {
break
}
alloutput = append(alloutput, o)
fmt.Println(o)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment