5 Concurrency And Parallelism

Pasted image 20251007185447.png

Data Parallelism

  • Same task, different data

Task Parallelism

  • Different task on same or different data

Pipeline Parallelism

Pasted image 20251007233836.png

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)
}