5 Concurrency And Parallelism

Data Parallelism
- Same task, different data
Task Parallelism
- Different task on same or different data
Pipeline Parallelism

readingQueue := []string{"temp", "dist",...}
// Channels between stages
readCh := make(chan ReadingBatch)
statsCh := make(chan StatsResult)
// Stage 1: Reading goroutine(s)
go func() {
for _, q := range readingQueue {
var data []float64
for i := 0; i < 1000000; i++ {
data = append(data, performReading(q))
time.Sleep(1 * time.Second)
}
readCh <- ReadingBatch{q, data}
}
close(readCh)
}()
// Stage 2: Normalization goroutine
go func() {
for batch := range readCh {
for i := range batch.data {
batch.data[i] = normalizeReading(batch.data[i])
}
mean, _ := stats.Mean(batch.data)
p99, _ := stats.Percentile(batch.data, 99)
median, _ := stats.Median(batch.data)
statsCh <- StatsResult{...}
}
close(statsCh)
}()
// Stage 3: Send results to Earth
for result := range statsCh {
sendToEarth(result.q, result.data, result.mean, result.p99, result.median)
}